如何在Apache PDFBox中加载系统字体?我希望我的应用程序能够为我的PDF选择任何已安装的字体,就像我可以在Libre Office或Microsoft Word中选择字体一样。
PDFBox是否与iText的FontFactory.registerDirectories()
等效?
在Apache PDFBox中加载字体的大多数现有示例都涉及下面的函数调用,但是此函数仅采用字体文件的直接路径,而不使用家族名称:
PDType0Font font = PDType0Font.load(document, new File("path/to/font-file.ttf"));
这很困难,因为:
Font.getFamilies()
仅返回姓氏,而不返回路径。 PDType0Font.load()
仅采用路径。GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts()
返回Font
对象,这些对象具有家族名称,但没有路径。同样,PDType0Font.load()
仅采用路径。FontFactory.registerDirectories()
源代码中浏览系统文件夹列表,但是随后我要处理路径,而不是姓氏。我不知道如何确定姓氏,也不知道如何在应用程序中将Arial和Arial Bold分组为单个字体(家族)。new FontFileFinder().find()
返回文件的URI路径,而不返回家族名称。同样的问题:我希望我的用户从字体列表中选择,而不是文件。for (FontInfo info : FontProvider.getFontInfo())
和FontCache().getFont(FontInfo)
似乎也提供了一个线索,但是我没有找到有关如何使用它们的示例。假设PDFBox中没有这样的registerSystemFonts()
方法,我愿意接受自定义代码解决方案。但是,如果唯一的方法是从iText的registerDirectories
复制所有需要的源代码,并通过修改使其适应PDFBox,我想知道从哪里开始。
答案 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