在 iText 中使用系统字体

问题描述 投票:0回答:1

我正在尝试使用 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 等解决方法?

java pdf fonts itext
1个回答
0
投票

我遇到了完全相同的问题:

如何使用 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();
© www.soinside.com 2019 - 2024. All rights reserved.