2013-12-14 150 views
3

我正在使用JasperReports和DynamicReports這塊java代碼來創建一個包含utf-8字符的pdf格式的報告,問題是生成的pdf文件不包含utf-所有8個字符,就像它們被替換爲「」一樣。當使用OutputStream創建utf-8文件時,有什麼我應該知道的嗎?使用FileOutputStream創建一個UTF-8 PDF文件

public void toPdf(String path){ 
     OutputStream outHtml; 
     try { 
      outHtml = new FileOutputStream(path); 

      jasperBuilder.toPdf(outHtml); 
     } catch (Exception e1) { 
      logger.error("failed to create PDF", e1); 
     } 
} 

這可能是值得注意的,即創建XLS和HTML文件時不會面臨這樣的問題。

請注意,我已追蹤到jasperBuilder.toPdf(outHtml);下有很多代碼行,並且在這些行中沒有我的utf-8字符正在被刪除。所以我猜魔鬼在outHtml = new FileOutputStream(path);

+0

「UTF-8 characters」是什麼意思? UTF-8只是一種編碼 - 它可以編碼所有* Unicode字符。 –

+0

日本人字符。或波斯語字符正在從報告中刪除 – MoienGK

+1

正確。這聽起來像是值得關注如何配置'jasperBuilder'。它會是關於那個而不是'FileOutputStream'。 –

回答

4

我設法解決它,這是一個字體和編碼問題。只是跟着教程here但fonts.xml

<fontFamilies> 
    <fontFamily name="FreeUniversal"> 
    <normal>/home/moien/tahoma.ttf</normal> 
    <bold>/home/moien/tahoma.ttf</bold> 
    <italic>/home/moien/tahoma.ttf</italic> 
    <boldItalic>/home/moien/tahoma.ttf</boldItalic> 
    <pdfEncoding>Identity-H</pdfEncoding> 
    <pdfEmbedded>true</pdfEmbedded> 
    </fontFamily> 
</fontFamilies> 

現在我有其他的挑戰來解決,使字體相對URL更改<pdfEncoding>UTF-8</pdfEncoding><pdfEncoding>Identity-H</pdfEncoding>

+0

用Identity-H替換UTF-8可以解決問題,但是如何:) – digz6666

2

A FileOutputStream完全不知道被寫入它的「東西」。它只是寫字節。如果字符被消除或者被破壞,那麼這是由於生成要寫入流的字節而引起的。

在這種情況下,我的錢會在運行此代碼之前配置/使用對象jasperBuilder

+0

嗯。感謝您的回覆。我不知道在哪裏看。然後我猜測碧玉的pdf生成器導致問題 – MoienGK

+0

@dave - 這是一種可能性。但是(海事組織)這個問題更可能是你使用Jasper Reports的方式。我確信Jasper Reports能夠處理全部有效的Unicode字符......正確使用。 –

+0

我沒有直接參與jasper,我使用動態報告來處理碧玉報告生成http://www.dynamicreports.org/ – MoienGK