天天看點

給寶寶的翻譯小軟體(續):支援PDF啦!

上次寫好翻譯小軟體後就展示給寶寶,

我:“寶寶,過來給你個小軟體”

她:“幹什麼用哒?”

我:“給你翻譯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後,直接輕按兩下即可運作。