最近測試了如何在 android app 裡面產生 PDF 檔案,我們的需求是:
- 不透過app server,直接產生PDF,並寫入到 SD Card
- 必須要能顯示 繁體中文 簡體中文 及英文
- 必須要能繪製文件表格
我們選擇了兩種 pdf library,測試在 android 產生 pdf 的能力
iText:這是最有名氣,處理pdf的library,但因為要在 android 上使用,我們不能直接使用原本的 itext library,要到 http://sourceforge.net/projects/itextg/ 下載 可在 android 平台運作的 itextg
Android PDF Writer:http://sourceforge.net/projects/apwlibrary/ 這是個簡單的 PDF library
解決問題的想法有兩種
- 直接產生有文字、圖片等內容的 PDF,但必須要解決中文字型的問題
- 先將內文資料用圖片的方式,以 Android Graphic Library 將文字、線條等資料,先畫在一張圖片上,然後再將圖片貼到 PDF 檔案中
測試結果如下:
iText 可直接用程式產生 文字 tables images 等東西
最大的問題是 中文字型。
如果要使用外部字型,例如 Truetype 的字型,會因為字型檔案過大,而造成 android 程式 out of memory
最好的方式是使用 iTextAsian.jar (參考 iText中文問題的解決之道)
此檔案可在 itext 的 extrajars 裡面取得 http://sourceforge.net/projects/itext/files/extrajars/
在程式中,可用以下的方式指定文字的字型
Font textfont = new Font(BaseFont.createFont("MHei-Medium", "UniCNS-UCS2-H", BaseFont.EMBEDDED));
需要搭配 android 及 pc 的 pdf reader 測試,必須確認產生出來的檔案 可以被 兩個平台的 pdf reader 讀取,尤其是繁體與簡體中文字型的部份
使用 apwlibrary 以畫圖的方式處理,在 ASUS 平板測試 PDF 正常,但是以 Samsun Galaxy-S 測試時,內建的PDF Reader 顯示出來的圖片卻都是 X
版權問題
iText 採行 Affero GPL ,以我們的專案來說,沒有問題,可以一併遵循 AGPL的規範,公開 source code
Android PDF Writer 採行 BSD,可以很自由地使用它