Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JasperReports:如何添加不在应用程序类路径中的字体_Java_Fonts_Jasper Reports_Classloader - Fatal编程技术网

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:添加自定义字体

  • 获取要使用的字体文件(TTF、EOT、SVG或WOFF(OTF转换为TTF 也很有效
  • 使用UI将字体添加到Jaspersoft Studio(或iReport)。(窗口->首选项->Jaspersoft Studio->字体)

    您需要提供如图所示的详细信息。特别是PDF字体名称字段具有误导性。我们需要在下一步创建的font-extention.jar中给出该字体的路径

    现在,您可以预览报表中的字体

  • 将字体导出到fonts-extention.jar文件,以便在应用程序中使用。选择并导出所需的字体。(窗口->首选项->Jaspersoft Studio->字体->选择并导出)

  • 注意将jar集成到构建中。如果您在项目中使用maven,您可以按如下方式进行集成

  • 
    local.jasperFont
    local.jasperFont
    1
    系统
    ${basedir}/src/main/resources/reports/fonts-extension.jar
    

    并在projectresources/reports目录中添加fonts-extension.jar。

    我们可以将Google Noto字体与Jasper一起使用

  • 按照中的说明将NOTOSAN系列打包到jar文件中 Jasper文档

  • 把这个罐子上传到我们的maven repo

  • 在pom中定义依赖项
  • 我们已经看到这个空指针异常,但关键是显式设置pdf的字体

    <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);
        }