如何使用Apache PDFBox将计算机上所有已安装的字体加载到PDF中?

时间:2019-07-05 04:24:19

标签: java fonts itext pdfbox

如何在Apache PDFBox中加载系统字体?我希望我的应用程序能够为我的PDF选择任何已安装的字体,就像我可以在Libre Office或Microsoft Word中选择字体一样。

PDFBox是否与iText的FontFactory.registerDirectories()等效?

  1. 我需要PDFBox才能知道PC上安装的字体。
  2. 我需要一种通过字体家族名称而不是字体文件将字体加载到PDF中的方法。
  3. 我希望能够简单地指定家庭+粗体/斜体。我不必知道Arial.ttf和Arial-Bold.ttf是否是两个单独的字体文件。

在Apache PDFBox中加载字体的大多数现有示例都涉及下面的函数调用,但是此函数仅采用字体文件的直接路径,而不使用家族名称:

PDType0Font font = PDType0Font.load(document, new File("path/to/font-file.ttf"));

这很困难,因为:

  • JavaFX的Font.getFamilies()仅返回姓氏,而不返回路径。 PDType0Font.load()仅采用路径。
  • Java AWT的GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts()返回Font对象,这些对象具有家族名称,但没有路径。同样,PDType0Font.load()仅采用路径。
  • 我可以从iText的FontFactory.registerDirectories()源代码中浏览系统文件夹列表,但是随后我要处理路径,而不是姓氏。我不知道如何确定姓氏,也不知道如何在应用程序中将Arial和Arial Bold分组为单个字体(家族)。
  • PDFBox的new FontFileFinder().find()返回文件的URI路径,而不返回家族名称。同样的问题:我希望我的用户从字体列表中选择,而不是文件
  • PDFBox的for (FontInfo info : FontProvider.getFontInfo())FontCache().getFont(FontInfo)似乎也提供了一个线索,但是我没有找到有关如何使用它们的示例。

假设PDFBox中没有这样的registerSystemFonts()方法,我愿意接受自定义代码解决方案。但是,如果唯一的方法是从iText的registerDirectories复制所有需要的源代码,并通过修改使其适应PDFBox,我想知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

要将系统字体按其系列名称加载到 PDF 中:


import org.apache.pdfbox.pdmodel.font.*;

...
var mapping = FontMappers.instance().getTrueTypeFont(fontName, null);
if (mapping != null && mapping.getFont() != null && !mapping.isFallback()) {
    try {
        return PDType0Font.load(document, mapping.getFont().getOriginalData());
    } catch (IOException e) {
        logger.warn("load font error", e);
        return null;
    }
}

灵感来自link

答案 1 :(得分:0)

在 FileSystemFontProvider.java 中,您可以看到以下几行来获取系统字体的路径

replyTo