1. 程式人生 > >itext 生成PDF文件後,iphone顯示亂碼,我是這樣解決的。

itext 生成PDF文件後,iphone顯示亂碼,我是這樣解決的。

使用itext工具類生成PDF文件後,在iphone上下載完預覽,無論是英文、中文、數字,統統是亂碼。但是其它不是由我的程式生成的但和我生成的PDF在一體上的(就是一部分是我生成的,另一部分是由程式拼接上去的)PDF在iphone上顯示都是正常的。所以問題排除了檔案編碼的問題,也排除了蘋果不支援中文的問題。那來再通過各種除錯發現是字型庫的問題。程式碼如下:

bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);    

就是前兩個引數的問題!!!

第一個STSong-Light表示itext內部預設的中文字型庫,其實就是itextAsian這個jar包下的一個properties檔名,即itext的jar包裡自帶的一個檔案。第二個UniGB-UCS2-H是第一個引數指向的字型檔檔案對應的橫排字型檔。還有一個豎排的,把H換成V就是了,這裡不討論。

後來我在我自己本地機器上的字型檔裡一個一個找對應的中文簡體字型庫,看哪一個可以在iphone裡可以正常顯示,就是一遍遍用不同的字型的列印PDF,然後放到iphone上看一下是不是顯示正常。後來找到了一個各原來字型相近的華文宋體,然後把程式碼改成了如下這樣:

bfChinese = BaseFont.createFont("C:\\windows\\fonts\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);


注意,這兩個引數都換了。

C:\\windows\\fonts\\STSONG.TTF
上邊這個就是我本機器上的字型檔目錄
BaseFont.IDENTITY_H
上邊這個就是itext對我本地那個字型庫的支援配置。

後來發現不能這麼幹,因為我們的生產和測試環境都是在linux伺服器上。我就把字型檔拷出來,然後放到我的工程目錄裡,把程式碼換成了:

bfChinese = BaseFont.createFont("com/utility/STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
就可以了。