Java JasperReports:如何添加不在应用程序类路径中的字体
我正在尝试使用一种字体,它没有安装在我的本地操作系统上,带有Java JasperReports:如何添加不在应用程序类路径中的字体,java,fonts,jasper-reports,classloader,Java,Fonts,Jasper Reports,Classloader,我正在尝试使用一种字体,它没有安装在我的本地操作系统上,带有JasperReports。jasper报告以这种方式使用: 名为Corbel的字体作为字体扩展名导出(使用iReport),并包含在我的系统的文件夹中的文件(Corbel.jar)中。 我使用如下代码将此扩展添加到应用程序的类路径中: ClassLoader cl=newurlclassloader(newurl[]){newurl(“file:///D:/path/to/Corbel_jar_folder/")}); par
JasperReports
。jasper报告以这种方式使用:
名为Corbel
的字体作为字体扩展名导出(使用iReport),并包含在我的系统的文件夹中的文件(Corbel.jar)中。
我使用如下代码将此扩展添加到应用程序的类路径中:
ClassLoader cl=newurlclassloader(newurl[]){newurl(“file:///D:/path/to/Corbel_jar_folder/")});
param=新的HashMap();
参数put(JRParameter.REPORT_CLASS_LOADER,cl);
jasperReport=jaspecompilemanager.compileReport(“d:/path/to/Report_with_Corbel_font.jrxml”);
jasperPrint=JasperFillManager.fillReport(jasperReport,param,new jrpemptyDataSource());
填写完报告后,我使用JRPdfExporter
导出它。但是,在结果pdf文件中,元素没有应用Corbel
字体。我没有包括pdf导出,因为我认为问题出在填充的某个地方。
我在JasperReports
中搜索并阅读了大量与使用/包括字体(即字体扩展)相关的帖子和问题;我仍然不知道错误或问题所在。
任何帮助都将不胜感激
提前谢谢你!(为错误的代码缩进感到抱歉,我希望我已经包含了足够的详细信息)问题是,字体扩展JAR的加载是从线程上下文类加载器和
JRParameter.REPORT\u CLASS\u加载器
完成的,也不是从jreporterParameter.CLASS\u加载器
完成的
因此,在我的例子中,必须保存当前(初始)线程类加载器,我们必须执行类似于thread.currentThread().setContextClassLoader(cl)
的操作,其中cl
是基于JasperReports
的应用程序的上下文,然后线程上下文类加载器被还原为原始类加载器
问题已得到回答,详情可供查阅
我希望这个答案能帮助其他面临类似(字体)问题的人。Jasper Reports:添加自定义字体
local.jasperFont
local.jasperFont
1
系统
${basedir}/src/main/resources/reports/fonts-extension.jar
并在projectresources/reports目录中添加fonts-extension.jar。我们可以将Google Noto字体与Jasper一起使用
<dependency>
<groupId>com.crunchtime.shared.fonts</groupId>
<artifactId>notosans</artifactId>
<version>1.0</version>
</dependency>
if (language-other-than-English) {
defaultStyle.setPdfFontName(CJK_FONT);
} else {
defaultStyle.setFontName(DEFAULT_FONT_FAMILY);
}