Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何配置BIRT报告引擎直接从类路径加载字体?_Java_Itext_Birt - Fatal编程技术网

Java 如何配置BIRT报告引擎直接从类路径加载字体?

Java 如何配置BIRT报告引擎直接从类路径加载字体?,java,itext,birt,Java,Itext,Birt,我正在编写一个Java应用程序,它使用BIRT生成报告。我想将自定义字体打包到jar文件中,并能够将它们嵌入到PDF报告中 我可以先将字体提取到文件系统,然后将BIRT指向文件系统位置,但我想知道是否可以将BIRT配置为直接从类路径加载字体?我查阅了BIRT的源代码,发现无法将BIRT配置为从类路径注册可嵌入字体。BIRT按照fontsConfig.xml中指定的路径注册字体。它使用iText的FontFactory。令人惊讶的是,FontFactory本身可以从类路径注册字体。但是BIRT的开

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


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

我查阅了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输出中。

非常感谢@dened

根据您的回答,我发现自定义字体也可以通过以下方式作为资源加载:

  • 将字体复制到resources文件夹(例如,Maven项目的src/main/resources)
  • 在BIRT引擎初始化代码中,注册字体而不指定路径。
    只需使用文件名,例如:\
导入com.lowagie.text.FontFactory

FontFactory.register(“gillsans.ttf”)
FontFactory.register(“GILLUBCD.TTF”)

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


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

请提供一个示例,说明我们如何将注册字体分配给Birt标签。