我正在尝试使用JasperReports
在我的本地操作系统上安装的字体。碧玉报告以这种方式使用:
<textField>
<reportElement x="0" y="0" width="137" height="20"/>
<textElement>
<font fontName="Corbel" size="12"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$F{something}]]></textFieldExpression>
</textField>
名为Corbel
的字体被导出为字体扩展名(使用iReport),并包含在我的系统上的文件夹中的文件(Corbel.jar)中。我将此扩展添加到应用程序的类路径中,使用如下代码:
ClassLoader cl = new URLClassLoader(new URL[] {new URL("file:///D:/path/to/Corbel_jar_folder/")});
param = new HashMap();
param.put(JRParameter.REPORT_CLASS_LOADER, cl);
jasperReport = JasperCompileManager.compileReport("d:/path/to/Report_with_Corbel_font.jrxml");
jasperPrint = JasperFillManager.fillReport(jasperReport, param, new JREmptyDataSource());
报告填写完毕后,我使用JRPdfExporter
将其导出。但是,在结果pdf文件中,元素没有应用Corbel
字体。我没有包含pdf导出,因为我认为问题出在填充的某个地方。我在JasperReports
搜索并阅读了许多与使用/包括字体(即扩展名)相关的帖子和问题;我仍然不知道错误或问题存在于何处。任何帮助将不胜感激。
先感谢您! (对不起代码缩进,我希望我已经包含了足够的细节)
问题是字体扩展jar的加载是从线程上下文类加载器和JRParameter.REPORT_CLASS_LOADER
,还是JRExporterParameter.CLASS_LOADER
完成的。
因此,在我的情况下,必须保存当前(初始)线程类加载器,我们必须执行类似Thread.currentThread().setContextClassLoader(cl)
的操作,其中cl
是基于JasperReports
的应用程序的上下文,然后线程上下文类加载器被还原为原始的。
问题已得到解答,详细信息可供here使用。
我希望这个答案可以帮助其他人面临类似的(字体)问题。
Jasper Reports:添加自定义字体
<dependency>
<groupId>local.jasperFont</groupId>
<artifactId>local.jasperFont</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/reports/fonts-extension.jar</systemPath>
</dependency>
并在项目资源/报告目录中添加fonts-extension.jar。
我们可以通过这些步骤将Jaso字体与Jasper一起使用
<dependency> <groupId>com.crunchtime.shared.fonts</groupId> <artifactId>notosans</artifactId> <version>1.0</version> </dependency>
private static final String DEFAULT_PDF_STYLE =“defaultPdf”;
private static final String DEFAULT_FONT_FAMILY =“NotoSans”;
private static final String CJK_FONT =“fonts / NotoSansCJKtc-Regular.otf”;
if (language-other-than-English) {
defaultStyle.setPdfFontName(CJK_FONT);
} else {
defaultStyle.setFontName(DEFAULT_FONT_FAMILY);
}
我们一直看到这个空指针异常,但关键是设置显式设置pdf的字体