gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:11:57 28 4
gpt4 key购买 nike

我读过

我预计 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 中的字体未安装时才会抛出:

Exception raised when a font name used as value for the fontName attribute in the report template, is not found in any of the runtime available JasperReports font extensions, nor among the font names available to the Java Virtual Machine.

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

最佳答案

您正在设置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 ,在字体扩展中包含实际的 ttf,指示编码以及是否应嵌入。

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

关于java - 如果缺少 PDF 字体,为什么 jasper 报告不会抛出 JRFontNotFoundException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57323549/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com