有時候想把PDF中的圖片文件提取出來,身爲程序員的我當然是自己寫段代碼來實現,先看看了網上的方法,都是逐行遍歷,正則匹配來提取什麼的,其實沒有那麼複雜,PyMuPdf官方文檔裏自帶就有提取圖片文件的方法,非常簡單,下來用代碼來記錄下:
1.提取圖片
#coding:utf-8
import fitz,os
doc = fitz.open('E:\\files\\25109878.pdf')
imgcount=0
for page in doc:
imageList = page.getImageList()
print(imageList)
for imginfo in imageList:
pix = fitz.Pixmap(doc, imginfo[0])
pix.writePNG(os.path.join("test\\t_{}.png".format(imgcount)))
imgcount+=1
短短几行代碼聊表心意,通過page.getImageList()提取到圖片列表信息,然後在使用fitz.Pixmap提取對應的圖片內容,就是這麼簡單,我們來提取下一張發票裏的圖片:
電子發票裏基本都是文字形式的,只有二維碼和下方印章的圖片,執行上面的代碼看看:
2.刪除PDF中的圖片部分
在官方文檔裏我沒看到,但是在它的庫文件有這個方法:
這個xref對應的應該是圖片所在位置的行數
#coding:utf-8
import fitz,os
doc = fitz.open('E:\\files\\25109878.pdf')
imgcount=0
for page in doc:
imageList = page.getImageList()
print(imageList)
for imginfo in imageList:
#刪除圖片
doc._deleteObject(imginfo[0])
#重新保存PDF
doc.save('111.pdf')
我們來執行看下:
很明顯圖片部分已經刪除掉了!
3、替換圖片
關於這塊由於時間原因沒有過多的去研究,這裏面有個問題就是,怎麼讓自己的圖片按照PDF中顯示的位置及大小進行替換,稍微看下了官方文檔,裏面只有個insertImage這個方法是插入圖片,但是其中有個rect的參數(top,left,wight,height),這幾個參數我沒太搞明白怎麼獲取到原始圖片的位置及大小,因爲有可能圖片是縮放過的,於是看了下insertImage的源代碼,發現有個_imgname的屬性。
原本的方法是在原來的圖片後面追加一張圖片:
但是這裏就有我提出來的問題怎麼獲取到原始圖片的位置及寬高,目前我還沒有找到這個方法,但發現了一個勉爲其難的方法,我將紅色部分註釋掉,然後這樣寫:
#coding:utf-8
import fitz,os
doc = fitz.open('E:\\files\\25109878.pdf')
imgcount=0
for page in doc:
imageList = page.getImageList()
for imginfo in imageList:
rect = fitz.Rect(0, 0, 80, 80)
page.insertImage(rect, filename="test.png", _imgname=imginfo[7])
doc.save('111.pdf')
這裏的imginfo[7]就是原始圖片的name,我直接插入到原始圖片的位置,我們來執行看看:
這樣貌似是實現了圖片的替換,但上面多了一塊fitz.Rect(0, 0, 80, 80)這個區域,查了下文檔貌似沒找到好的辦法處理,那我就將它設置爲fitz.Rect(0, 0, 0.1, 0.1),我們來看看:
這樣就勉強實現了替換的效果,其實主要關鍵就是怎麼獲取到原始圖片的座標及寬高,如果能解決這個問題,那就不需要這麼麻煩的操作,由於時間原因,我也沒有過多的去深入研究了,如果有知道的小夥伴記得@我^_^
以上就是利用PyMuPdf提取、刪除及替換PDF中的圖片文件
關注公衆號,超越平凡才能成就自我