pdfsharp кириллица

337
18 декабря 2017, 11:48

Есть такой код

// Создаем новый PDF документ
PdfDocument document = new PdfDocument();
// Создаем пустую страницу
PdfPage page = document.AddPage();
// Получаем объект XGraphics для "рисования" элементов на странице
XGraphics gfx = XGraphics.FromPdfPage(page);
// картинка
gfx.DrawImage(XImage.FromFile("путь до картинки\\1.jpg"), 110, 10);
// Специальная опция для шрифта. Это чтобы русский текст нормально отображался
XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
document.Info.Author = "автор";
document.Info.Subject = "тема";
document.Info.Title = "заголовок";
document.Info.Keywords = "ключи";
// Создаем шрифта
XFont font = new XFont("Times New Roman", 40, XFontStyle.Bold, options);
// Рисуем текст. Да да) вы не ослышались. Рисуем текст в указанных координатах
gfx.DrawString("Здесь был водяной знак", font, XBrushes.Black,
new XRect(0, 0, page.Width, page.Height),
XStringFormat.Center);
string filename = "Test.pdf";
// Сохраняем файл под названием Test.pdf
document.Save(filename);
// ... и запускам сразу в программе просмотра pdf файлов
Process.Start(filename);

но после генерации в полях тайтл, автор и т.д появляются такие символы

703>;>2>: 02B>@  B5<0

пример на картинке

Буду благодарен если кто то подскажет как исправить.

Answer 1

У PDFSharp есть проблема с кодировкой при записи метаданных PDF-документа. На официальном форуме PDFSharp было предложено временное решение, но видимо эту ошибку до сих пор не починили. Решение проверено лично, действительно работает.

Небольшой пример по использованию:

1. Создаем класс-хелпер со специальным методом, для перекодирования строки нужным образом.

public static class PdfHelper
{
    public static string EncodingHack(string str)
    {
        var encoding = Encoding.BigEndianUnicode;
        var bytes = encoding.GetBytes(str);
        var sb = new StringBuilder();
        sb.Append((char)254);
        sb.Append((char)255);
        for(int i = 0; i < bytes.Length; ++i)
        {
            sb.Append((char)bytes[i]);
        }
        return sb.ToString();
    }
}

2. При записи значений в метаданные, применяем метод преобразования.

document.Info.Author = PdfHelper.EncodingHack("автор");
document.Info.Subject = PdfHelper.EncodingHack("тема");
document.Info.Title = PdfHelper.EncodingHack("заголовок");
document.Info.Keywords = PdfHelper.EncodingHack("ключи");

В принципе, если запись метаданных выполняется в одном месте приложения, можно оформить код преобразования в виде локальной функции или приватного метода класса, в котором PDF создается, это не имеет большого значения. Я отдаю предпочтение именно статическому классу, т.к. позже, в нем можно разместить и другие часто используемые последовательности действий, например определение шрифтов, абзацев, таблиц и прочие полезности, которые можно параметризовать и лень каждый раз писать полностью.

READ ALSO
Что будет если будет запущено 2 процеса

Что будет если будет запущено 2 процеса

Что произойдет если запустить оба процесса которые описаны ниже:

229
Как определить, запущено ли на удаленном хосте приложение? - C#

Как определить, запущено ли на удаленном хосте приложение? - C#

Я пишу курсовую работу, в которой нужно написать игру по сети для двоих игроковУ меня есть форма, в которую я прописываю IP-адрес удаленного...

257
Как создается многозадачность?

Как создается многозадачность?

Как создается многозадачность?

225
Как подключиться к MySQL базе данных, которая лежит на сервере (не локальном), через C#, WPF

Как подключиться к MySQL базе данных, которая лежит на сервере (не локальном), через C#, WPF

Есть база данных, которая лежит на сервере (не локальном), необходимо подключиться к ней через WPF приложениеВ javaFX проблем не было, нужно было...

299