Как создать PDF на иврите?в настоящее время PDF генерируется пустым - PullRequest
0 голосов
/ 30 декабря 2018

Я использую iTextSharp 5.5.13, и когда я пытаюсь сгенерировать PDF на иврите, он выходит пустым.это мой код: я делаю что-то не так?

    public byte[] GenerateIvhunPdf(FinalIvhunSolution ivhun)
    {
        byte[] pdfBytes;
        using (var mem = new MemoryStream())
        {
            Document document = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.GetInstance(document, mem);
            writer.PageEvent = new MyHeaderNFooter();
            document.Open();
            var font = new 
            Font(BaseFont.CreateFont("C:\\Downloads\\fonts\\Rubik-Light.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED), 14);
            Paragraph p = new Paragraph("פסקת פתיחה")
            {
                Alignment = Element.ALIGN_RIGHT

            };
            PdfPTable table = new PdfPTable(2)
            {
                RunDirection = PdfWriter.RUN_DIRECTION_RTL
            };
            PdfPCell cell = new PdfPCell(new Phrase("מזהה", font));
            cell.BackgroundColor = BaseColor.BLACK;
            table.AddCell(cell);

            document.Add(p);
            document.Add(table);
            document.Close();
            pdfBytes = mem.ToArray();

        }
        return pdfBytes;
    }

PDF выходит пустым

1 Ответ

0 голосов
/ 07 января 2019

Я изменил несколько деталей вашего кода, и теперь я получаю это:

screen shot

Мои изменения:

Встраиваниешрифт

Поскольку в моей системе не установлен Rubik, я должен встроить шрифт в PDF, чтобы иметь возможность что-либо увидеть.Таким образом, я заменил BaseFont.NOT_EMBEDDED на BaseFont.EMBEDDED при создании var font:

var font = new Font(BaseFont.CreateFont("Rubik-Light.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 14);

Создание вида работы Paragraph

Вы создаете Paragraph p без указанияшрифт.Таким образом, используется шрифт по умолчанию с кодировкой по умолчанию.Кодировка по умолчанию - WinAnsiEncoding , которая похожа на Latin1, поэтому иврит не может быть представлен.Я добавил ваш экземпляр шрифта Rubik в Paragraph p создание:

Paragraph p = new Paragraph("פסקת פתיחה", font)
{
    Alignment = Element.ALIGN_RIGHT
};

Et voilà, надпись появляется.

Разработчики iText часто сообщают, что в iText 5.x иболее ранние сценарии с написанием справа налево правильно поддерживаются только в определенных контекстах, например, в таблицах, но не в других, таких как абзацы, сразу добавляемые в документ.Поскольку ваш Paragraph p сразу добавляется к Document document, его буквы появляются в неправильном порядке в выводе.

Как заставить PdfPTable работать

Вы определили PdfPTable table, чтобы иметь два столбца (new PdfPTable(2)), но затем вы добавили только одну ячейку.Таким образом, table не содержит даже ни одной полной строки.Поэтому при добавлении в документ iText ничего не рисует.

Я изменил определение table, чтобы он содержал только один столбец:

PdfPTable table = new PdfPTable(1)
{
    RunDirection = PdfWriter.RUN_DIRECTION_RTL
};

Более того, я закомментироваллиния, устанавливающая черный цвет фона ячейки, потому что обычно трудно прочитать черное на черном:

PdfPCell cell = new PdfPCell(new Phrase("מזהה", font));
//cell.BackgroundColor = BaseColor.BLACK;
table.AddCell(cell);

И снова появляется надпись.

Правильная загрузка шрифта

ДругойВозможное препятствие заключается в том, что при загрузке шрифта с заданного вами URL - https://fonts.google.com/selection?selection.family=Rubik - на вкладке настройки ящика выбора можно увидеть, что по умолчанию в загрузку включены только латинские символы, в частности не ивритские:

Screenshot

Я проверил файл шрифта, загруженный со всеми включенными языковыми опциями:

Screenshot, all selected

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...