我正在尝试使用 iText 在 Java 中生成 PDF 文档。 链接
但我也想让用户有机会选择文档使用哪种字体。系统中安装了很多字体,我可以使用
列出它们GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
但是当我尝试直接将字体名称传递给
BaseFont
构造函数时
BaseFont.createFont(s, BaseFont.IDENTITY_H, true);
我遇到了这样的异常
com.lowagie.text.DocumentException: Font 'Abyssinica SIL' with 'Identity-H' is not recognized.
另一个选项是将字体文件的路径传递给
BaseFont
(存储在jar内或系统上的某个位置),但在第一种情况下,我必须使用我的应用程序部署所有字体,在第二种情况下我必须想出一种获取系统字体文件位置的方法。据我所知,Java 在字体上放置了一个抽象层 - 公共 API 不知道任何路径,并且不鼓励使用私有 API(例如 FontManager)。
还有一个选择是使用在 BaseFont 中声明的常量,但这只提供 4 种字体(Courier、Helvetica、Symbol 和 Times Roman)。
有没有办法在 PDF 中使用由 iText 生成的系统字体,而无需使用应用程序部署它们并使用 FontManager 等解决方法?
我遇到了完全相同的问题:
如何使用 iText pdf 库中的(操作系统)系统字体?
第一种方法(不起作用)
在 Java 中,我可以像这样迭代字体:
java.awt.Font[] systemFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
for (java.awt.Font awtSystemFont : systemFonts) {
//list of java system fonts
}
pdf库
DefaultFontMapper
类似乎有一个合适的方法:
DefaultFontMapper fontmapper = new DefaultFontMapper();
fontmapper.awtToPdf(awtSystemFont);
但是此方法仅返回 base14 字体,并且默认情况下通常返回 Helvetica。但我需要例如Arial、Roboto 等。
第二种方法(没用)
然后我发现我也可以实现我自己的
FontMapper
,它加载AWT字体,但是没有跨平台的方法来访问*.ttf文件本身。需要访问受限制的软件包(例如 com.sun),否则它只能在特定操作系统下运行。
第三种方法(确实有效!)
//this registers the font dirs across platforms
FontFactory.registerDirectories();
Font itextFont = FontFactory.getFont("Arial",12);
//if the basefont is needed, access it like this:
itextFont.getBaseFont();