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。

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

2 則留言:

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

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

    回覆刪除