2010-06-30 132 views
4

我试图使用字体,该字体未安装在我的本地操作系统上,其编号为JasperReports。碧玉报告使用了这种方式: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中搜索并阅读了许多与使用/包括字体(即字体扩展名)相关的帖子和​​问题;我仍然不知道错误或问题所在。 任何帮助将不胜感激。

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

回答

7

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

因此,在我的情况下,当前(初始)线程的类加载器必须保存后,我们不得不这样做Thread.currentThread().setContextClassLoader(cl),其中clJasperReports基于应用的上下文,然后线程上下文ClassLoader被收归原来的一个。

这个问题已回答并提供详细信息here

我希望这个答案能够帮助其他面临类似(字体)问题的人。

相关问题