2012-10-05

用 Java 產出中文的 JasperReports PDF

Jasperreports 與 iReport 的中文問題,網路上可以找到的文章多半都是在講 Jasperreports 1 或 2 那個年代的作法,就是去設 Pdf Font name、Pdf Embedded 與 Pdf Encoding,都是四五年前的事,這些屬性也被 Deprecated 了。


我也不知道 Jasperreports 什麼時候改作法,這篇筆記用的是 4.6 這個版本,離最新的 4.7.1 應該不會有差別。

中文顯示可以分成三個部份:
  • iReport Preview
  • iReport 產出 PDF
  • Java 產出 PDF

以下逐項說明。

先在 iReport Designer 裡輸入中英文與數字,甚至難字。


然後到 Preview 看看,沒問題。


然後將 Preview 從 Interval Preview 改成 PDF Preview。


再 Preview 一次,PDF 的中文全不見了。


解答:為 iReprot 安裝中文字型,以及中文欄位選用中文字型。

開啟「工具 > 選項 > iReport > Fonts > Install Font」。


True Type Font 輸入微軟正黑體「C:\Windows\Fonts\msjh.ttf」,或者標楷體「C:\Windows\Fonts\kaiu.ttf」、新細明體「C:\Windows\Fonts\mingliu.ttc」,這是 Win7 的路徑。

下一頁的 PDF EncodingIdentity-H(Unicode with horizontal writing),然後按下完成。

可以在「工具 > 選項 > iReport > Fonts」看到剛安裝的字型。


最後為中文欄位選用中文字型。


完成後到 Preview 看看,噹,PDF 也有中文囉!



事情結束了嗎?不,正要開始,接下來要用 Java 來產生 PDF,這才是重點。

先在 iReport 開啟報表屬性,將 Language 改成 Java,然後重新編譯報表或 Preview 也有編譯的效果。


再用 Java 產出 PDF 報表,記得要附上剛產生的 jasper 檔。
// 先用 iReport 套用 Template 做出一個 Jasper 檔來
// iReport 預設產生 XML 檔,在預覽過後,在 XML 所在目錄就會產出 Jasper 檔
String jsFile = "D:/_Download/report4.jasper";
String outFile = "D:/_Download/report4.pdf";
try {
 // 產出報表
 JasperPrint print = JasperFillManager.fillReport(jsFile, new HashMap<String, Object>(), new JREmptyDataSource());
 JRExporter exporter = new JRPdfExporter();
 exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFile);
 exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
 exporter.exportReport();
}
catch (JRException e) {
 e.printStackTrace();
}
PDF 產生了,但是中文不見了。

剛才 iReport 無法顯示中文是因為不知道中文字型,那現在也是一樣的狀況嗎?假設是,那怎麼告訴 Java 字型在哪呢?

解答:將用到的中文字型「打包」成 jar 檔,丟到專案裡。

但是!但是!這個打包不是壓縮改檔名就可以的。

回到 iReport 的「工具 > 選項 > iReport > Fonts」,左鍵加 ctrl 將「有用到的中文字型」統統選起來,然後按下「Export as extension」,檔名輸入「fonts.jar」(其他名字也行)。


將剛的 Java 專案關聯到這個 fonts.jar,再產出一次 PDF。

噹噹,下班了。
---
---
---

6 則留言:

  1. 導出的 jar 要加放在那個目錄 ,怎麼加入

    是否可以說明一下呢?

    謝謝!

    回覆刪除
  2. 導出的 jar 要加放在那個目錄 ,怎麼加入

    是否可以說明一下呢?

    謝謝!

    回覆刪除
  3. 導出的 jar 要加放在那個目錄 ,怎麼加入

    是否可以說明一下呢?

    謝謝!

    回覆刪除
  4. 導出的 jar 要加放在那個目錄 ,怎麼加入

    是否可以說明一下呢?

    謝謝!

    回覆刪除
  5. 放在 Java 程式執行時可以讀到的地方,以最常見的 Java Webapp 為例,就是放在 WEB-INF/lib 下就可以了。

    回覆刪除
  6. 想不到又再次藉由您的文章解決了PDF 中文顯示的問題!
    文章寫得很清楚!!!

    回覆刪除