-1

我的要求是在生成 PDF 时,现在我将 Arial Unicode.ttf 用于包括 CJK 在内的 i18n 语言。

BaseFont nationalBase = null;
Font headerFont = null;
nationalBase=BaseFont.createFont("Arial_Unicode_MS.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
headerFont = new Font(nationalBase, 10, Font.NORMAL, new Color(138,138,138));    
Paragraph p = new Paragraph("Hello Everyone 是时候了 쓰기 รูปแบบไฟล์ PDF" , headerFont);
document.add(p);

现在,正如您在我正在写入 PDF 的字符串中看到的那样,它有多种语言,因为我想将 Arial_Unicode_MS.ttf 替换为另一个字体文件作为其许可版本。我试图合并 Google Noto 的文件,但因为这有不同的 UPM字体(如 CJK 有 2048 UPM,所有其他有 1000 UPM,如泰语、埃及语..等)所以不能。将常规文件与 CJK 合并。我尝试嵌入 GNU 自由字体,但由于它是基于位图的,因此并没有给人以实际的感觉。现在的问题是,iText 中是否有任何可用的工具,比如我是否可以根据字符添加多种我想要的字体它在第一个 ttf 文件上找不到,它将继续寻找第二个 ttf 文件,然后是第三个......直到集合不为空。

private static Font ArbFont = new Font("NotoNakshArabic.ttf", 18,Font.BOLD);
private static Font ScFont = new Font("NotoSansCJKSc-Regular.ttf", 12,Font.NORMAL, BaseColor.RED);
private static Font tcFont = new Font("NotoSansCJKTc-Regular.ttf", 16,Font.BOLD);
private static Font KrFont = new Font("NotoSansCJKKr-Regular.ttf", 12,Font.BOLD);

请对此提供帮助,因为我想根据文件所在的字符动态加载文件,但是由于我一次要创建巨大的文件,所以我无法检查每个字符并加载特定文件。

4

1 回答 1

0

您正在寻找的机制由FontProvider该类提供。

您首先实例化FontProvider并向其添加字体。然后将此实例设置为您的提供者Document,选择一个或多个字体系列名称作为首选字体系列,并开始添加到您的文档中:

FontProvider provider = new FontProvider();
for (String resourceName : new String[] { "NotoNaskhArabic-Regular.ttf", "NotoSansCJKkr-Regular.otf", "NotoSansCJKsc-Regular.otf", "NotoSansCJKtc-Regular.otf", "NotoSansThai-Regular.ttf " }) {
    try (   InputStream resource = getClass().getResourceAsStream(resourceName) ) {
        provider.addFont(StreamUtil.inputStreamToArray(resource));
    }
}

try (   PdfDocument pdfDoc = new PdfDocument(new PdfWriter("FontProviderForAshaKoshti.pdf"));
        Document doc = new Document(pdfDoc) ) {
    doc.setFontProvider(provider);
    doc.setFontFamily("NotoSans");

    Paragraph p = new Paragraph("Hello Everyone 是时候了 쓰기 รูปแบบไฟล์ PDF");
    doc.add(p);
}

UseFontProvider测试testFontProviderForAshaKoshti

结果:

截屏

一些备注:

  • 我从资源中添加了字体。或者,您当然也可以在文件系统中添加任意字体文件。
  • 除了您提到的字体之外,我还添加了 NotoSansThai,因为您的示例字符串包含泰语书写。
  • 看起来您可以重复使用FontProvider跨文档。(目前)情况并非如此。原因是创建了特定于单个Document.
  • 可以在此处找到类似的问题和答案。与这里的情况相反,他们使用 C++ 和 C#,而不是 Java,同时该方法SetFont已被弃用,取而代之的是SetFontFamily.
于 2019-08-15T11:42:06.077 回答