上次寫好翻譯小軟體後就展示給寶寶,
我:“寶寶,過來給你個小軟體”
她:“幹什麼用哒?”
我:“給你翻譯Word文檔的”
她:“怎麼用啊?”
我:“選擇一個docx文檔,再按翻譯按鈕就好了”
她:“哇,這麼厲害!”
。。。。。。
她:“可以翻譯PDF嗎?好多文檔都是PDF的哦”
我:“這個。。。可以有”
她:“好棒啊!”
然後,又一陣。。。。。。
“自己吹下的牛皮,含淚也要實作。” 不過,這可不是吹牛皮。之前接觸過提取PDF内容的事情,是以還是有把握的。
從PDF裡面提取文本内容有很多種方法,但是真正适合的還是要研究一番才能做出正确的選擇。選擇的标準就是:适合Windows,速度要快。
一、pdfminer
這是純Python實作的PDF内容提取的庫,很适合Python開發,Linux和Windows上使用都很友善。
去github搜尋“pdfminer”,排在第一的是老的版本,隻支援Python 2。支援Python 3的版本叫做: pdfminer.six,也支援Python2,它的位址是:
https://github.com/pdfminer/pdfminer.six
然而,它的速度很慢,因為是純Python寫的。有多慢呢?看看下面它與pdftotext的對比測試吧:
測試檔案大小: 2.1MB
(1)pdftotext 用時: 1.031s
time ./bin/pdftotext -enc UTF-8 z.pdf z.txt
real 0m1.031s
user 0m1.004s
sys 0m0.008s
(2)pdfminer 用時: 2m29.226s == 149.226s
time pdf2txt.py z.pdf
real 2m29.226s
user 2m29.016s
sys 0m0.064s
兩者相差149倍!!我家寶寶是個急脾氣,讓她等那麼長時間,我還能好過嗎?果斷舍棄pdfminer,選擇pdftotext。
二、pdftotext
這是一個基于xpdf用C++寫的指令行工具,速度杠杠的(見上面的對比)。有人也把它封裝成了Python庫——pdftotext,但是要編譯成動态庫才能被Python所用。這個封裝基于poppler庫(基于xpdf)。
然而,要在Windows上編譯這個Python庫太不容易了。基本的編譯環境有VC和minGW,具體見:
https://wiki.python.org/moin/WindowsCompilers
我選擇minGW編譯環境,編譯Python庫時各種依賴太複雜。斷斷續續整了幾天未果,隻好放棄使用這個Python封裝庫。
三、subprocess調用pdftotext.exe
pdftotext指令行工具有Windows版本的可執行檔案下載下傳:
https://www.xpdfreader.com/download.html
那我就用subprocess調用即可。這樣我開發省事兒,寶寶用着速度也夠快,一舉兩得。
路線定好後,程式寫起來就很快了。時間多花在路線定制上,好的路線值得花費時間去制定,往往能得到事半功倍的效果。
四、用pyinstaller釋出程式
上一個版本用pyinstaller打包程式很容易,因為除了程式檔案沒有其它附加檔案,而這次程式包含了pdftotext.exe等檔案,導緻打包不是那麼順利。這其中的經驗,我将總結為一篇專門講解pyinstaller的文章,敬請期待。
五、翻譯軟體:transdocx的運作
(1)從源代碼運作:
直接運作transdocx.py即可。當然,相應的Python庫要先安裝好。
另外,源代碼檔案夾 bin/ 下面的pdftotext.exe不是翻譯軟體,而是被翻譯軟體用來從PDF中提取文本的程式,不要直接運作它。
(2)下載下傳打包好的翻譯軟體
下載下傳transdocx-*.exe後,直接輕按兩下即可運作。