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

时间:2010-06-30 17:00:39

标签: java fonts jasper-reports classloader

我正在尝试使用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中搜索并阅读了与使用/包含字体(即扩展名)相关的大量帖子和问题;我仍然不知道错误或问题存在于何处。 任何帮助将不胜感激。

提前谢谢! (对不起代码缩进,我希望我已经包含了足够的细节)

3 个答案:

答案 0 :(得分:7)

问题是字体扩展jar的加载是从线程上下文类加载器和JRParameter.REPORT_CLASS_LOADER以及JRExporterParameter.CLASS_LOADER完成的。

因此,在我的情况下,必须保存当前(初始)线程类加载器,我们必须执行类似Thread.currentThread().setContextClassLoader(cl)的操作,其中clJasperReports的上下文基于应用程序,然后线程上下文类加载器被还原为原始的。

问题已得到解答,详细信息可供here

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

答案 1 :(得分:0)

碧玉报告:添加自定义字体

  1. 获取要使用的字体文件(TTF,EOT,SVG或WOFF(OTF转换为TTF 也可以))
  2. 使用UI将字体添加到Jaspersoft Studio(或iReport)。 (窗口->首选项-> Jaspersoft Studio->字体)

    Add Font

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

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

    Font Added

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

  4. 请注意将jar集成到构建中。如果您在项目中使用maven,则可以按以下步骤进行集成。

<?php
/*  File : compatibility.php
    Example : If PHP Greater than 7, then lets create these function as it depreceated 
    http://php.net/manual/en/migration71.deprecated.php
*/
if(version_compare(PHP_VERSION,7,">"))
{
    function mcrypt_encrypt(){

    }
    function mcrypt_decrypt(){

    }

    function mcrypt_encode(){

    }
    function mcrypt_decode(){

    }

    // Do something with these constants

    //MCRYPT_MODE_ECB
    //MCRYPT_MODE_CBC
    //MCRYPT_RAND
    //MCRYPT_RIJNDAEL_256

    function mcrypt_get_iv_size(){

    }
    function mcrypt_create_iv(){

    }


}

然后将fonts-extension.jar添加到项目resources / reports目录中。

答案 2 :(得分:0)

通过这些步骤,我们可以在Jasper中使用Google Noto字体

  1. 按照中的说明将NotoSans系列包装到jar文件中 Jasper文档。

  2. 将此罐子上传到我们的Maven存储库

  3. 在pom中定义依赖项
<dependency>
  <groupId>com.crunchtime.shared.fonts</groupId>
  <artifactId>notosans</artifactId>
  <version>1.0</version>
</dependency>
  1. 然后在我们的中使用。我认为这是最困难的部分,但这是我们做到的方式

私有静态最终字符串DEFAULT_PDF_STYLE =“ defaultPdf”;

私有静态最终字符串DEFAULT_FONT_FAMILY =“ NotoSans”;

私有静态最终字符串CJK_FONT =“ fonts / NotoSansCJKtc-Regular.otf”;

   if (language-other-than-English) {
        defaultStyle.setPdfFontName(CJK_FONT);
    } else {
        defaultStyle.setFontName(DEFAULT_FONT_FAMILY);
    }

我们曾经看到过这个空指针异常,但是关键是要明确设置pdf的字体