如何配置BIRT Report Engine直接从类路径加载字体?

时间:2014-04-11 20:09:09

标签: java itext birt

我正在编写一个使用BIRT生成报告的Java应用程序。我想在jar文件中打包自定义字体,并将它们嵌入到PDF报告中。

我可以首先将字体提取到文件系统,然后将BIRT指向文件系统位置,但我想知道是否可以配置BIRT直接从类路径加载字体?

2 个答案:

答案 0 :(得分:9)

我查阅了BIRT的源代码,发现无法配置BIRT来从类路径注册可嵌入字体。 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输出中。

答案 1 :(得分:0)

非常感谢@dened。

使用您的答案,我发现还可以通过以下方式将自定义字体作为资源加载:

  • 将字体复制到资源文件夹(例如,Maven项目的src / main / resources)
  • 在BIRT引擎初始化代码中,注册字体而不指定路径。
    仅使用文件名,例如:\

import com.lowagie.text.FontFactory;
...
FontFactory.register(“ gillsans.ttf”);
FontFactory.register(“ GILLUBCD.TTF”);

FontFactory将在resources文件夹中搜索并找到这些文件。这适用于带有iText v2.1.7的BIRT运行时4.4.2。

这似乎是将非标准字体加载到BIRT运行时引擎中的一种好方法,以便它们在生成的PDF中工作。如果使用这种方法,则不需要将字体添加到系统字体文件夹或JRE / lib / fonts文件夹,并且BIRT罐子中的fontsConfig.xml文件也不需要编辑...一切都是包含在应用程序中。