- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用一种字体,它没有安装在我的本地操作系统上,带有 JasperReports
。 jasper报表是这样使用的:
<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 .
我希望这个答案能帮助其他面临类似(字体)问题的人。
关于java - 碧 Jade 报告 : How to add font not in the application classpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3151562/
我是一名优秀的程序员,十分优秀!