JasperReports:如何添加不在应用程序类路径中的字体

aco*_*che 6 java fonts jasper-reports classloader

我试图使用一个没有安装在我的本地操作系统上的字体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>
Run Code Online (Sandbox Code Playgroud)

命名的字体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());
Run Code Online (Sandbox Code Playgroud)

填写报告后,我使用a导出它JRPdfExporter.但是,在结果pdf文件中,元素没有Corbel应用字体.我没有包含pdf导出,因为我认为问题出在填充的某个地方.我搜索并阅读了许多与使用/包含字体(iefont扩展)相关的帖子和​​问题JasperReports; 我仍然不知道错误或问题存在于何处.任何帮助将不胜感激.

先感谢您!(对不起代码缩进,我希望我已经包含了足够的细节)

aco*_*che 7

问题是字体扩展jar的加载是从线程上下文类加载器和从JRParameter.REPORT_CLASS_LOADER,而不是JRExporterParameter.CLASS_LOADER.

因此,在我的情况下,必须保存当前(初始)线程类加载器,我们必须做类似的事情Thread.currentThread().setContextClassLoader(cl),基于应用程序cl的上下文,JasperReports然后线程上下文类加载器被还原为原始的.

问题已得到解答,详情请见此处.

我希望这个答案可以帮助其他人面临类似的(字体)问题.