如何在希伯来语中生成PDF?当前PDF生成为空

时间:2018-12-30 13:52:27

标签: itext

我正在使用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 :(得分:0)

我更改了一些代码细节,现在我明白了:

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
};

等等,出现了文字。

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