2016-08-23 63 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標準,併爲您提供混合不同編碼的能力。

相關問題