江湖小白之進階篇 (四)使用PyMuPdf庫來實現圖片PDF文件的提取

     人上了年紀就容易回憶過去,淡淡的憂愁……這裏不禁吐槽,誰說的擺地攤沒城管管的,你出來,我保證不打死你!玩了一晚上搬家遊戲,哎,還是老老實實回來敲代碼吧。

    本來這篇我們要接着將Sanic框架的websocket服務的,但是爲了防止枯燥無味,我們先來實現一下對PDF文件的提取,一般PDF裏基本都是圖片形式的,我們就選擇PyMuPdf庫來實現,首先來安裝一下要使用的庫PyMuPdf和opencv:

#安裝PyMuPdf
pip install PyMuPdf

#安裝opencv圖像處理庫
pip install opencv-python

這裏爲什麼使用opencv呢,這裏有我自己的原因,我以後想把提取出來的圖片進入文字識別,opencv能方便的把圖片處理成識別需要的數據格式,你也可以用PIL來處理圖片。

來,接着繼續,小二上代碼:

#coding:utf-8
import fitz,cv2,uuid
import numpy as np

class Pdf():
    def __int__(self):
        pass

    def pdf2pic(self,filename):
        try:
            #加載讀取pdf文件
            doc = fitz.open(filename)
            #循環提取pdf頁面
            for i in range(doc.pageCount):
                # 獲取當前頁內容
                page = doc[pageCount]
                # 縮放及旋轉
                zoom = 3
                rotate = 0
                trans = fitz.Matrix(zoom, zoom).preRotate(rotate)
                pm = page.getPixmap(matrix=trans, alpha=False)
                # 這裏獲取到數據流,看了下源碼,下面可以直接用getPNGdata()
                getpngdata = pm.getImageData(output="png")
                # 解碼爲 np.uint8
                image_array = np.frombuffer(getpngdata, dtype=np.uint8)
                img_cv = cv2.imdecode(image_array, cv2.IMREAD_ANYCOLOR)
                # 保存爲圖片測試看看
                filename='{}_{}.png'.format(pageCount,uuid.uuid4())
                cv2.imwrite('app\\files\\{}'.format(filename), img_cv)
        except Exception as e:
            print(e)
        return filename

if __name__=='__main__':
    path='app\\files\\test.pdf'
    p=Pdf()
    p.pdf2pic(path)

這裏我創建了一個類文件來實現提取的方法,看上面的代碼其實很簡單,這裏我不太多的講了,但有幾個地方我要重點說下,在實際開發中肯定會用到:

1.其中的getImageData方法,這是獲取數據流的格式,有什麼用?比如你針對PDF文件提取後做圖像識別,在過程中不想將圖片保存後再去識別,那這裏就是關鍵了,我們在結合cv2直接將提取的數據流轉換成識別需要的數據格式,提高執行的效率及資源的佔用.

2.fitz.open(filename)這裏是打開pdf本地文件,實現在線pdf文件的處理,我們一般的處理過程是上傳文件,將文件保存後在調用這個文件執行,但是這種方式太low了,對我們這些立志成爲大牛的級別的人來說是不屑的,那怎麼直接轉換數據呢,我們可以跟蹤一下這個open的方法:

繼續跟進:

看到沒有,處理了加載文件路徑,還可以直接使用文件流,那這就方便了,不需要我們將文件保存下來在執行了,使用方法就是:

#比如我從瀏覽器上傳了pdf文件,我們用request接收了文件
file = request.files.get('file')

#直接傳遞文件流數據
doc = fitz.open('type',file.body)

這樣就不要將圖片保存下來後再去處理,節約了時間和資源,我們運行看看:

嗯,我感覺行~~!

好了,這篇的內容就到這裏結束了,嗯,感覺好睏,去睡個覺!

什麼是江湖?煩惱不斷,爲生活奔波!江湖不說再見,咱們下篇見!

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

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