給寶寶用Python寫個支援翻譯PDF文件的小軟體

王平發表於2019-02-17

上次用Python寫好翻譯doc文件小軟體後就展示給寶寶,

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

她:“幹什麼用噠?”

我:“給你翻譯Word文件的”

她:“怎麼用啊?”

我:“選擇一個docx文件,再按翻譯按鈕就好了”

她:“哇,這麼厲害!”

。。。。。。

她:“可以翻譯PDF嗎?好多文件都是PDF的哦”

我:“這個。。。可以有”

她:“好棒啊!”

然後,又一陣。。。。。。

python翻譯pdf文件

“自己吹下的牛皮,含淚也要實現。” 不過,這可不是吹牛皮。之前接觸過提取PDF內容的事情,所以還是有把握的。

從PDF裡面提取文字內容有很多種方法,但是真正適合的還是要研究一番才能做出正確的選擇。選擇的標準就是:適合Windows,速度要快。

一、對比選取Python抽取pdf文件庫

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來抽取PDF文件

這是一個基於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釋出翻譯PDF文件程式

上一個版本用pyinstaller打包程式很容易,因為除了程式檔案沒有其它附加檔案,而這次程式包含了pdftotext.exe等檔案,導致打包不是那麼順利。這其中的經驗,我將總結為一篇專門講解pyinstaller的文章,敬請期待。

五、翻譯軟體:transdocx的執行

(1)從原始碼執行:

直接執行transdocx.py即可。當然,相應的Python庫要先安裝好。

另外,原始碼資料夾 bin/ 下面的pdftotext.exe不是翻譯軟體,而是被翻譯軟體用來從PDF中提取文字的程式,不要直接執行它。

(2)下載打包好的翻譯軟體

下載transdocx-*.exe後,直接雙擊即可執行。

最後,跟上次一樣,關注猿人學Python公眾號發訊息“翻譯”獲得軟體下載地址,傳送“翻譯原始碼”獲得本軟體的原始碼。

pyinstaller擴充閱讀:
用Python給我家寶寶寫個翻譯軟體

用pyinstaller打包你的Python程式並繫結CPU

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章