起因
最近工作中有個任務,在word里面插入PDF對象,比較郁悶的是,同事發的很多PDF文件,里面的圖片不是正的,於是自己用PDF瀏覽軟件——Adobe Reader XI,把圖像翻轉一下,但是發現保存的選項是灰色的。翻轉后另存為一個新文件,打開新文件,卻還是未翻轉的狀態,百度搜了一下,發現這個免費的軟件只能查看不能編輯,所以翻轉圖片也算是編輯咯?想了想也沒毛病,畢竟相對於原文件來說,發生了改變。
同事給我推薦了一下國內比較有名氣的某昕軟件,使用了一下,發現和“Adobe Reader XI”一樣,未登錄用戶只能查看不能編輯,注冊登錄成為免費會員后,雖然解鎖了部分編輯的功能,但是更頭疼的還會有他們的水印,需要付費才能去除水印。這時我就想起來自己在上家公司做的一個批量把jpg和tif格式的文件合成pdf 文件時所用的一個Python第三方庫——PyPDF2,隨手網上搜了一下,代碼不多,隨后“cv”大法下來,然后跑起代碼后卻報了很多錯誤(對於近半年沒搞過開發的我來說,七八行報錯確實算多的了)最下面的錯誤代碼是“Expected object ID (5 0) does not match actual (4 0); xref table not zero-indexed.”,度娘搜到的結果都不符合要求,於是搬梯子上谷歌,結果也不盡人意,要么是未解決,要么是類似的問題(充其量只能算個類似的警告:“PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected”),糾結了一天,難道是這個庫很久沒更新?pdf有了新技術,導致這個庫一些功能用不了了?
過程
重新學習這個庫(其實就是找個pdf 文件,照着官方文檔,或者百度其他人的代碼把部分功能跑一邊),這里有個問題,這邊我學習跑代碼的時候,用的是另外一個我在網上下載的一款交換機的pdf產品彩頁,並沒有用同事發給我的那幾個(需要翻轉)pdf文件測試(當時我也不知道自己怎么想的),學習使用中,發現一些方法(比如pdf文件信息,總頁數等等)都是沒問題的。
測試沒問題,把代碼中源文件的路徑由同事發給我的pdf文件改為了這個交換機的產品彩頁,結果報了另外的錯誤:“UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 8: invalid start byte和PyPDF2.utils.PdfReadError: Illegal character in Name Object”雖然生成了我要生成pdf文件,但是新的文件打開后提示“文件損壞”,且文件大小為0,搜了一下,有位大神在18年6月份的通過改源碼的方式,解決了這bug(https://github.com/mstamy2/PyPDF2/issues/438),看的不是很懂,直到在csdn上看到另外一篇今年10月份 的博客(https://blog.csdn.net/kmesky/article/details/102695520), 格式上更容易讀懂一些, 跟着看了一下源碼,作者只改了“PyPDF2\generic.py", line 484”一處,另一處“PyPDF2/utils.py 第238行”沒有改,於是我改了一下,重新跑,發現結果是一樣的。
接下來無聊的測試中,發現使用“Adobe Reader XI”直接另存為一個PDF文件,雖然內容是一樣的,但是文件的大小發生了變化,且使用代碼去翻轉的時候,沒有報錯。所以目前的解決辦法是使用代碼實現這個軟件的另存為功能。但是使用Python的復制方法,都達不到我要的效果(https://www.cnblogs.com/keeptg/p/10944109.html)。
結果
暫時先把這幾個BUG給使用捕獲異常加彈窗的形式給跳過去吧。
GitHub:https://github.com/Gnbp/handlePDF
如果有大神能幫忙解決這個BUG,不勝感激~