4

在过去的几个月里,我使用字体 Courier 生成了成千上万的 pdf(在开发时在 Windows 7 上,在测试和生产时在 OpenSuse 上)。

现在我有了使用 Arial 的目标。所以我在我们的属性文件中切换了字体名称,我得到了这个异常:

Stacktrace 片段:com.itextpdf.text.DocumentException:无法识别带有“Cp1252”的字体“Arial”。在 com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:708) 在 com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:615) 在 com.itextpdf.text.pdf.BaseFont.createFont (BaseFont.java:450)

google了一会儿后,我找到了解决方案。我只需要在设置中使用“Arial.ttf”(如文件名)。但在那之后,我得到了另一个例外:

java.io.IOException: Arial.ttf not found as file or resource.
  at com.itextpdf.text.io.RandomAccessSourceFactory.createByReadingToMemory(RandomAccessSourceFactory.java:224)
  at com.itextpdf.text.io.RandomAccessSourceFactory.createBestSource(RandomAccessSourceFactory.java:173)
  at com.itextpdf.text.pdf.RandomAccessFileOrArray.<init>(RandomAccessFileOrArray.java:147)
  at com.itextpdf.text.pdf.TrueTypeFont.process(TrueTypeFont.java:625)
  at com.itextpdf.text.pdf.TrueTypeFont.<init>(TrueTypeFont.java:369)
  at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:699)
  at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:615)
  at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:450)

所以有提示,itextpdf 现在正在寻找一个文件。所以我只是在C:\\Windows\\Fonts\\Arial.ttf我们的配置中输入了文件名。现在它起作用了!

但目标只是使用“Arial”作为字体名称。可能吗?

非常感谢!

4

1 回答 1

8

不能只使用 Arial 这个名称,因为 Arial 没有被列为 14 种标准 Type 1 字体之一(而 Courier 是这 14 种字体之一)。

如果你想使用 Arial,你总是需要参考 arial.ttf 文件,是的,这可能意味着你需要提供c:/windows/fonts/arial.ttf一个路径。

如果您想让您的应用程序平台独立,您可以将字体与您的代码一起作为资源发送,并使用该资源的路径。

另一种解决方案是使用FontFactoryand 注册所有字体。请注意,注册字体的初始调用可能需要一些时间,因为它FontFactory会在硬盘上搜索尽可能多的字体,查看可能包含字体文件的目录(取决于操作系统)。查看FontFactoryExample并尝试使用register(),registerDirectory()registerDirectories()方法。

于 2013-09-04T12:59:42.430 回答