【发布时间】:2014-05-26 03:32:14
【问题描述】:
我正在编写一个使用 BIRT 生成报告的 Java 应用程序。我想将自定义字体打包到 jar 文件中,并能够将它们嵌入 PDF 报告中。
我可以先将字体提取到文件系统,然后将 BIRT 指向文件系统位置,但我想知道是否可以将 BIRT 配置为直接从类路径加载字体?
【问题讨论】:
我正在编写一个使用 BIRT 生成报告的 Java 应用程序。我想将自定义字体打包到 jar 文件中,并能够将它们嵌入 PDF 报告中。
我可以先将字体提取到文件系统,然后将 BIRT 指向文件系统位置,但我想知道是否可以将 BIRT 配置为直接从类路径加载字体?
【问题讨论】:
查阅了BIRT的源码,发现无法配置BIRT从classpath注册可嵌入字体。 BIRT 通过 fontsConfig.xml 中指定的路径注册字体。它使用 iText 的FontFactory。令人惊讶的是,FontFactory 本身可以从类路径中注册字体。但是BIRT的开发者可能不知道这个特性,所以BIRT不会注册任何不在文件系统上的字体,即当File#exists()返回false时。
幸运的是,FontFactory.register() 是一个静态方法,所以有一个变通方法:我们可以绕过 BIRT 自己注册字体。在初始化 BIRT 之前,我们可以做以下事情:
FontFactory.register("/com/example/fonts/font1.ttf");
FontFactory.register("/com/example/fonts/font2.ttf");
我试过了,字体正确嵌入到 PDF 输出中。
【讨论】:
非常感谢@dened。
使用您的回答,我发现自定义字体也可以通过以下方式加载为资源:
导入 com.lowagie.text.FontFactory;
...
FontFactory.register("gillsans.ttf");
FontFactory.register("GILLUBCD.TTF");
FontFactory 将在资源文件夹中搜索并找到这些文件。这适用于带有 iText v2.1.7 的 BIRT 运行时 4.4.2。
这似乎是将非标准字体加载到 BIRT 运行时引擎中以便它们在生成的 PDF 中工作的好方法。如果采用这种方式,字体不需要添加到系统字体文件夹或者JRE/lib/fonts文件夹中,BIRT的jars中的fontsConfig.xml文件也不需要编辑……一切都是包含在应用程序中。
【讨论】: