什么是iText 7等效的FontSelector.Process?

时间:2018-03-14 21:47:01

标签: fonts itext itext7

我正在开始更新针对iText5编写的代码以使用iText7。

iText7中是否有类似于FontSelector类的机制,您可以在其中加载字体,“Process”操作会自动确定要使用的字体(并返回可以添加到文档中的格式化pdf“块”) )?这是代码片段(这是C ++,但我的“本地”语言是C#,所以可以随意回答C#)。

try {
    doc = gcnew Document();
    pdfWriter = PdfWriter::GetInstance(doc, pdfStream);

    FontSelector^ selector = gcnew FontSelector();
    selector->AddFont(gcnew Font(BaseFont::CreateFont("Fonts\\cour.ttf"), BaseFont::IDENTITY_H, BaseFont::NOT_EMBEDDED), 10.0f));
    selector->AddFont(gcnew Font(BaseFont::CreateFont("Fonts\\arialuni.ttf"), BaseFont::IDENTITY_H, BaseFont::NOT_EMBEDDED), 10.0f));

    doc->Open();
    while (textReader->EndOfStream == false)
    {
        String^ line = textReader->ReadLine();
        doc->Add(selector->Process(line + "\n"));
}

1 个答案:

答案 0 :(得分:1)

iText7确实提供了类似的机制。甚至有一种方法可以隐式地使其工作,而无需处理块并手动将它们添加到文档中。您要查找的班级名为FontProvider。首先,您需要创建一个实例并将字体添加到其中:

FontProvider provider = new FontProvider();
provider.AddFont(fontsFolder + "NotoSans-Regular.ttf");
provider.AddFont(fontsFolder + "FreeSans.ttf");
provider.GetFontSet().AddFont(fontsFolder + "Puritan2.otf", PdfEncodings.IDENTITY_H);

然后,您需要layout的{​​{1}}实例,这些实例可能是这样创建的,或者是以任何其他方式创建的:

Document

然后,您只需将字体提供程序设置为文档,最重要的是,设置首选字体名称以触发字体选择器机制。如果您未选择首选字体名称且未明确设置PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); ,则将使用默认字体PdfFont

执行上述操作的代码可能如下所示:

Helvetica

最后,不要忘记关闭文档:

doc.SetFontProvider(provider);
doc.SetFont("NotoSans");
Paragraph paragraph = new Paragraph("Hello world! \u05E2\u05B4\u05D1\u05B0\u05E8\u05B4\u05D9\u05EA\u202C");
doc.Add(paragraph);