PDF 簡體/正體轉換

Posted by tjwei on 星期五, 7月 06, 2012 with No comments
 
網路上的簡體資源很多,圖書館中很多中文電子書也都是簡體的。雖說有時直接閱讀簡體不影響,但總是有些時候,我會比較想用正體字來閱讀。當然,也有不少人有正體轉簡體的需求。
文字檔的轉換不是什麼問題,但如果你上網搜尋 PDF 簡體/正體轉換的方式,得到的結果大概會是「先轉成 DOC/HTML,然後轉碼,最後再轉回 PDF」。
這是一般所謂的電腦專家可以給你的最好答案了。 但你是程式設計師,你是 Python 玩家,所以這個答案對你不夠好。


之所以沒有這樣的工具,通常歸於下面兩個原因,一個原因是 PDF 太複雜了,一個是 PDF 本來就是設計用來讀而不是拿來修改的。
這兩個原因都有一部分的真實性。PDF 的格式版本多,而且同一種東西可以有許多不同的表達方式。可以參考陳鍾誠 的 PDF 檔案格式研究。文字的編碼不是 unicode,而且會隨 font 不同而改變。
我拿我手上的一些電子書來處理,有了一些初步的進展。我基本上只處理 Identity-H with TTF descendant fonts 的情況。
用到了 pdfrw, opencc (python ctypes wrapper), fontTools 這三個 module。
pdfrw 和 pyPdf 差不多,但是 pyPdf 在寫入的時候出了些問題(雖然應該不難改),而且無法處理 Indentity-H。不過我靠 pyPdf 了解了不少 Pdf  的結構。
當使用 Identity-H with TTF descendant fonts,文字是使用 TTF 中的 GlyphID 當成編碼。這也合理,畢竟 PDF 是用來顯示和列印的。
TTF 檔案在 /fontfile2 這個物件的 stream 中。可以靠 /ToUnicode 來解出文字,如果 TTF 有 cmap,可以靠 cmap 來解。
大多數情況, /Contents 和 /fontfile2 的 stream 都有壓縮。好在直接用 python 的 zlib module 就能壓縮/解壓了。
所以我從 /Contents 中把文字找出,靠 /ToUnicode 解出 unicode,用 opencc 翻成台灣正體,找個適合的正體 ttf 檔,用 fontTools 把每個字的 GlyphID 找到,再塞回去 /Contents 中,最後再靠 pdfrw 寫成 pdf 即可。
比「先轉成 DOC/HTML,然後轉碼,最後再轉回 PDF」要酷多了吧。
上面第一張圖的右邊是原來的簡體 PDF,左邊是換成 bkai 字體。第二張圖的左邊是 win7 中的simfang 仿宋體,右邊是 Droid Sans Fallback。
所以對字體控來說應該有用。
目前 source code 還太醜,等更多測試之後再放到 github 上。
更新:
https://github.com/tjwei/translatePDF
Source Code 在 github 上,對於某些文字版的書,效果不錯。
Categories: ,