如果缺少 PDF 字体,为什么 jasper 报告不会抛出 JRFontNotFoundException?

2023-12-12

I read

  • https://stackoverflow.com/a/4028080/5277820
  • https://stackoverflow.com/a/35549391/5277820
  • http://community.jaspersoft.com/questions/543275/fonts-problem-while-using-jasper-reports-402-version
  • http://refermycode.com/remove-font-dependency-in-jasper-report/

我预计 Jasper Reports 会抛出一个JRFontNotFoundException如果机器上没有安装字体。

但我的应用程序不会抛出JRFontNotFoundException,尽管我还没有在任何(Jaspersoft Studios、JasperReports、Adobe Acrobat Reader)机器上安装使用的字体“Helvetica”。

JRXML:

<parameter name="timestamp" class="java.util.Date"/>
[...]
<textField>
    <reportElement x="0" y="0" width="50" height="16" uuid="0007846a-26f1-457a-a198-67a2f7c8417c">
        <property name="local_mesure_unitwidth" value="pixel"/>
        <property name="com.jaspersoft.studio.unit.width" value="px"/>
        <property name="local_mesure_unitx" value="pixel"/>
        <property name="com.jaspersoft.studio.unit.x" value="px"/>
        <property name="local_mesure_unity" value="pixel"/>
        <property name="com.jaspersoft.studio.unit.y" value="px"/>
        <property name="local_mesure_unitheight" value="pixel"/>
        <property name="com.jaspersoft.studio.unit.height" value="px"/>
    </reportElement>
    <box padding="2"/>
    <textElement textAlignment="Left" verticalAlignment="Top">
        <font size="8" pdfFontName="Helvetica" pdfEncoding="Cp1250" isPdfEmbedded="true"/>
    </textElement>
    <textFieldExpression><![CDATA[DATEFORMAT($P{timestamp},"dd.MM HH:mm")]]></textFieldExpression>
</textField>

Maven 依赖项:

<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>5.6.0</version>
</dependency>
<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports-functions</artifactId>
    <version>5.6.0</version>
</dependency>

Java:

private byte[] createPdf() {

    try {
        InputStream is = getClass().getResourceAsStream("MyReport.jasper");
        JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("timestamp", new Date());
        JRDataSource jrDataSource = new JRBeanCollectionDataSource(new Vector(), false);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
        byte[] pdf = JasperExportManager.exportReportToPdf(jasperPrint);
        return pdf;
    } catch (JRException e) {
        throw new RuntimeException("Could not create PDF.", e);
    }
}

原因是JRFontNotFoundException仅当属性中有字体时才会抛出fontName未安装:

当字体名称用作值时引发异常fontName在任何运行时可用的 JasperReports 字体扩展中,以及在 Java 虚拟机可用的字体名称中都找不到报告模板中的属性。

如果属性中的字体有什么方法可以中止 PDF 的生成pdfFontName未安装(而不是使用任何其他已安装的字体)?


您正在设置pdfFontName not fontName

pdfFontName以前是老方法,现在已弃用指示 itext 库应使用什么字体,jasper-reports 不会抛出异常JRFontNotFoundException如果字体丢失,itext 将抛出一个异常,该异常被捕获并作为JRRuntimeException.

在 itext Helvetica 中包含为afm文件,因此如果使用它,itext 不会抛出任何异常,但是这确实不保证你的文字是正确呈现如果您在 jasper-reports 中指示另一种字体(在您的情况下不指示=默认字体)。事实上,这是一团糟,而且pdfFontName and pfdEncoding已被弃用。

如果未安装属性 pdfFontName 中的字体,是否有任何方法可以中止 PDF 的生成?

不要使用pdfFontName,但如果你坚持(为了这个问题)那么也设置fontName="Helvetica",设置 jasper-reports 字体会引发JRFontNotFoundException如果没有找到。

The 正确的方法就是只设置fontName然后提供字体扩展,在字体扩展名中包含实际的ttf,指示编码以及是否应嵌入。

顺便说一句:我会使用 Identity-H 编码,这对于较新的 PDF 标准是推荐的,并且使您能够混合不同的编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果缺少 PDF 字体,为什么 jasper 报告不会抛出 JRFontNotFoundException? 的相关文章

随机推荐