ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-05-15 21:56:55  阅读:251  来源: 互联网

标签:java fonts classloader jasper-reports


我试图使用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的应用程序的上下文,然后是线程context classloader被恢复为原始的.

问题已得到解答,详细信息可用于here.

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

标签:java,fonts,classloader,jasper-reports
来源: https://codeday.me/bug/20190515/1110799.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有