过去几个月我使用字体Courier生成pdfs文件(在开发时使用Windows 7,测试和生产时使用OpenSuse)。
现在我的目标是使用Arial。所以我在属性文件中切换了字体名称,我得到了这个例外:
Stacktrace片段:com.itextpdf.text.DocumentException:字体'Arial' 'Cp1252'无法识别。在 com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:708)at at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:615)at at 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”作为字体名称。有可能吗?
Thanx很多!
答案 0 :(得分:4)
不可能仅使用名称Arial,因为Arial未被列为14种标准Type 1字体之一(而Courier是其中之一)。
如果你想使用Arial,你总是需要引用arial.ttf文件,是的,这可能意味着你需要提供c:/windows/fonts/arial.ttf
作为路径。
如果您想使您的应用程序与平台无关,您可以将代码作为资源运送字体,并使用该资源的路径。
另一个解决方案是使用FontFactory
并注册所有字体。请注意,注册字体的初始调用可能需要一些时间,因为FontFactory
将在您的硬盘上搜索尽可能多的字体,因为它可以查找可能包含字体文件的目录(取决于操作系统)。查看FontFactoryExample并试用register()
,registerDirectory()
和registerDirectories()
方法。