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

问题描述 投票:6回答:3

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

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

java fonts jasper-reports classloader
3个回答
7
投票

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

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

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

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


0
投票

Jasper Reports:添加自定义字体

  1. 获取您要使用的字体文件(TTF,EOT,SVG或WOFF(转换为TTF的OTF也适用))
  2. 使用UI将字体添加到Jaspersoft Studio(或iReport)。 (Window-> Preferences-> Jaspersoft Studio-> Fonts) Add Font 您需要提供图像中的详细信息。特别是PDF字体名称字段具有误导性。我们需要在font-extention.jar中为此字体提供此路径,我们将在下一步中创建该路径。 现在,您可以在报告中预览字体。 Font Added
  3. 将字体导出到fonts-extention.jar文件以在您的应用程序中使用。选择并导出所需字体。 (Window-> Preferences-> Jaspersoft Studio-> Fonts-> Select and Export)
  4. 注意将jar集成到您的构建中。如果您在项目中使用maven,则可以按如下方式进行集成。
        <dependency>
           <groupId>local.jasperFont</groupId>
           <artifactId>local.jasperFont</artifactId>
           <version>1.0</version>
           <scope>system</scope>
           <systemPath>${basedir}/src/main/resources/reports/fonts-extension.jar</systemPath>
        </dependency>

并在项目资源/报告目录中添加fonts-extension.jar。


0
投票

我们可以通过这些步骤将Jaso字体与Jasper一起使用

  1. 按照Jasper文档中的说明将NotoSans系列打包到jar文件中。
  2. 将此jar上传到我们的maven repo
  3. 在pom中定义依赖关系
<dependency>
  <groupId>com.crunchtime.shared.fonts</groupId>
  <artifactId>notosans</artifactId>
  <version>1.0</version>
</dependency>
  1. 然后在我们的。我认为这是最难的部分,但这就是我们这样做的方式

private static final String DEFAULT_PDF_STYLE =“defaultPdf”;

private static final String DEFAULT_FONT_FAMILY =“NotoSans”;

private static final String CJK_FONT =“fonts / NotoSansCJKtc-Regular.otf”;

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

我们一直看到这个空指针异常,但关键是设置显式设置pdf的字体

© www.soinside.com 2019 - 2024. All rights reserved.