用python進行pdf比較

用python進行pdf比較

最近突然遇到一個需求,那就是要檢測一下一本書的兩個版本,上一版本和目前版本(以下簡稱A版和B版)到底在第幾頁有所不同,由於手動校對特別麻煩,就利用python簡單的寫了一個pdf比較器。用的庫都比較簡單,基本就是PIL, wand和scipy(當然numpy也肯定要引用啦)。

這個程序的思路非常之簡單,就是把pdf的每一頁都分割開來做成jpg圖片,然後把A版的pdf產生的圖片和B版的pdf產生的圖片的像素點進行掃描,比較RGB 的值,如果RGB的值有不同,就說明這一頁有進行修改,從而在命令行中列印出來對應的頁碼。

雖然思路非常簡單,但是其中遇到的坑點還挺多的,而且封裝過程中也遇到了一些麻煩,所以就拿知乎來記錄一下,也當是給自己寫了一個說明文檔。

先說一下我的編譯環境。

Python的編譯器我是用的 JetBrains PyCharm Edu 2018.1 x64, 我以前都是非常簡單的用python的原生idle來進行編譯的,但是有時候寫程序確實發現比較難用,在知乎上搜了搜貌似pycharm比較好,而且教育版也基本夠用,本次就初次嘗試利用pycharm來進行編程了。

接下來我會詳細的列出我遇到的一些問題

  1. 關於wand

wand的部分還是比較坑爹的,因為wand需要引用ImageMagick的API,所以還要再下載一個ImageMagick並且安裝他的一些庫用來引用。

這裡開始放需要的鏈接

Installation - Wand 0.4.4?

docs.wand-py.org圖標

在wand的安裝步驟中,有一個ImageMagick的下載鏈接,坑爹的是他給的下載鏈接竟然是個無效鏈接,感覺作者真的是好久沒更新了還是怎麼的,反正就是不能下載,高版本的ImageMagick裝上去後就老報錯。一直都不能用,經過一番搜尋,發現有個伺服器上有低版本的ImageMagick。

這裡繼續放鏈接

http://ftp.icm.edu.pl/packages/ImageMagick/binaries/?

ftp.icm.edu.pl

通過這個網址就可以下載對應的版本,安裝完成以後即可使用。

2. 關於運行速度

運行速度部分的話,本來想著每個圖片RGB檢測一下,數字放入array裡面,然後遍歷array看一下有沒有不一樣的就可以達到目的了。但是吧,後來發現利用python來跑循環真的是慢的令人髮指,想了想就(面向谷歌編程以後)用scipy吧,scipy裡面可以import一個fromimage能夠返回圖片的RGB值作為numpy的一個array。按照matlab的經驗呢,一般矩陣比較起來總是比循環快一點的,所以就改了一下代碼,試了一下速度果然提升好多。但這也為後面的編譯埋下了伏筆。

3. 關於編譯

由於其他人電腦里沒有python,所以最好還是要把這個東西做成一個exe文件來讓別人用。然後就要進行一個python程序的封裝啦。又想了想發現(再次面向谷歌編程以後)pyinstaller還比較好用,於是就用pyinstaller來進行編譯了。編譯過程中遇到的最坑爹的就是,一直出現 error:lib not found,因為scipy的庫pyinstaller一直找不到,這個bug困擾了我大概半天,網上查來查去,試了各種辦法都沒有解決,最後想了一想,引用了一下庫的路徑竟然就解決了。大概也就是下面這一條命令的事(竟然用了半天時間真是太羞恥了):

pyinstaller -F --paths C:UserslixibDesktopCode2018.04.23venvLibsite-packagesscipyextra-dll pdf_num_detect.py

編譯完這個以後還沒完,運行了一下exe竟然發現 messagestream 沒找到,於是又在xx.spec中加了一條命令,這才編譯過去並且正常使用了。

hiddenimports=[scipy._lib.messagestream]

感覺坑點都寫的差不多了,如果有人也遇到了跟我一樣的問題的話可以在下面留言,接下來就是放github的時間啦!

如果有需要的話,下面是我的github上寫的項目,代碼比較黑暗,但還是能用,畢竟小項目別要求這麼多嘛是吧,以後有空的話可能會再加點GUI完善一下,爭取讓它更好看一點。

xiboli/compare-pdf

感覺這事情思路非常簡單,但這麼小的一個項目寫起來不可以說是不麻煩,寫代碼還是一件非常需要耐心和韌性的事。不知不覺水水知乎又水了一個小時,這星期上的課,課本還沒看完呢,溜了溜了。。。


推薦閱讀:

Python · CNN(一)· 層結構
函數文檔中動詞的單數第三人稱?
python任務調度之schedule

TAG:Python | 科技 | PyCharm使用技巧 |