【问题标题】:How to configure BIRT Report Engine to load fonts directly from the classpath?如何配置 BIRT 报告引擎直接从类路径加载字体?
【发布时间】:2014-05-26 03:32:14
【问题描述】:

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

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

【问题讨论】:

    标签: java itext 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文件也不需要编辑……一切都是包含在应用程序中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多