2016-08-23 61 views
4

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

,我预计,Jasper报表抛出一个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); 
    } 
} 

原因为t帽子JRFontNotFoundException如果在属性fontName字体未安装只抛出:

异常时用作值在报告模板的fontName属性的字体名称,未在任何运行时可用JasperReports的字体的发现提出扩展名以及Java虚拟机可用的字体名称之间。

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

回答

5

你正在设置pdfFontNamefontName

pdfFontName是一个老办法,现在弃用指示什么字体的iText库应该使用,碧玉报告将不会抛出JRFontNotFoundException如果字体丢失,而不是iText的意志抛出一个被捕获并重新启动为JRRuntimeException的异常。

在iText的黑体被列为afm文件,因此iText的不会引发任何异常,如果这被使用,但是这并不能保证您的文字是正确呈现如果要表示另一种字体(在你的情况下,不指示=默认字体)在jasper报告。事实上,这是一个混乱,pdfFontNamepfdEncoding已被弃用。

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

不要使用pdfFontName,但如果你坚持(对这个问题的缘故),那么还设置fontName="Helvetica",设置碧玉报告字体将引发JRFontNotFoundException如果没有找到。

正确的方法是只设置fontName,然后提供font-extensions,在字体扩展你包括实际ttf,指示编码和是否应该被嵌入。

顺便说一句:我会使用编码Identity-H这是建议为新的PDF标准,并为您提供混合不同编码的能力。

相关问题