如何配置 BIRT 报告引擎直接从类路径加载字体?
Posted
技术标签:
【中文标题】如何配置 BIRT 报告引擎直接从类路径加载字体?【英文标题】:How to configure BIRT Report Engine to load fonts directly from the classpath? 【发布时间】:2014-05-26 03:32:14 【问题描述】:我正在编写一个使用 BIRT 生成报告的 Java 应用程序。我想将自定义字体打包到 jar 文件中,并能够将它们嵌入 PDF 报告中。
我可以先将字体提取到文件系统,然后将 BIRT 指向文件系统位置,但我想知道是否可以将 BIRT 配置为直接从类路径加载字体?
【问题讨论】:
【参考方案1】:查阅了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 输出中。
【讨论】:
您能否提供示例,我们如何将注册字体分配给 Birt 标签。【参考方案2】:非常感谢@dened。
使用您的回答,我发现自定义字体也可以通过以下方式加载为资源:
将字体复制到资源文件夹中(例如 Maven 项目的 src/main/resources) 在 BIRT 引擎初始化代码中,注册字体而不指定路径。 只需使用文件名,例如:\导入 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文件也不需要编辑……一切都是包含在应用程序中。
【讨论】:
以上是关于如何配置 BIRT 报告引擎直接从类路径加载字体?的主要内容,如果未能解决你的问题,请参考以下文章
PDF 中需要 Arial 字体(BIRT pdf 渲染器,Linux)