如何配置 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 报告引擎直接从类路径加载字体?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 BIRT 日志记录集成到应用程序日志记录中?

PDF 中需要 Arial 字体(BIRT pdf 渲染器,Linux)

动态配置和生成 BIRT 报告

如何使用 informix.jvp.dbapplet.impl.JVPClassLoader 从类路径加载资源?

如何从类路径中读取log4j属性文件

Birt 报告查看器无法启动 [重复]