【问题标题】:Why doesn't jasper report throw a JRFontNotFoundException if font for PDF is missing?如果 PDF 的字体丢失,jasper 报告为什么不抛出 JRFontNotFoundException?
【发布时间】:2016-12-30 06:07:14
【问题描述】:

我读过

如果机器上未安装字体,我预计 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 虚拟机可用的字体名称中都找不到时,引发异常。

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

【问题讨论】:

    标签: java fonts jasper-reports pdf-generation export-to-pdf


    【解决方案1】:

    您设置的是pdfFontName 而不是fontName

    pdfFontName 是一种旧方法,现在 不推荐使用 来指示 itext 库应该使用什么字体,如果字体丢失,jasper-reports 不会抛出 JRFontNotFoundException,而是 itext 会抛出一个被捕获并作为JRRuntimeException 重新启动的异常。

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

    如果没有安装属性 pdfFontName 中的字体,有什么方法可以中止生成 PDF?

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

    正确的方法是只设置fontName,然后提供font-extensions,在font-extension中包含实际ttf,指明编码以及是否应该嵌入。

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

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 2015-08-14
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多