【问题标题】:JasperReports: How to add font not in the application classpathJasperReports:如何在应用程序类路径中添加字体
【发布时间】:2011-03-10 06:09:34
【问题描述】:

我正在尝试使用一种字体,它没有安装在我的本地操作系统上,带有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 中搜索并阅读了许多与使用/包括字体(即字体扩展)相关的帖子和​​问题;我仍然不知道错误或问题出在哪里。 任何帮助将不胜感激。

提前感谢您! (抱歉代码缩进不好,我希望我已经包含了足够的细节)

【问题讨论】:

    标签: java fonts jasper-reports classloader


    【解决方案1】:

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

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

    问题已得到解答,详情请见here

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

    【讨论】:

      【解决方案2】:

      Jasper 报告:添加自定义字体

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

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

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

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

      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。

      【讨论】:

        【解决方案3】:

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

        1. 按照说明将 NotoSans 系列打包到 jar 文件中 贾斯珀文档。

        2. 将此 jar 上传到我们的 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";

        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 的字体

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-09
          • 2022-01-26
          相关资源
          最近更新 更多