使用PyMuPdf提取、刪除及替換PDF中的圖片文件

有時候想把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中的圖片文件

關注公衆號,超越平凡才能成就自我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章