本文作者:王碧琪
文字編輯:戴 雯
技術總編:張 邯
之前我們使用pymupdf提取了PDF文檔中的文本信息菜枷,那么對于圖片信息沦偎,也可以進行一波提取木张。今天我們一起來試試迁筛。
一煤蚌、簡介
待提取PDF文檔“demo1”內(nèi)容如下:
image
可以觀察到,該文檔中共有4張圖片细卧。提取思路為:首先得到PDF文檔的所有對象尉桩,然后遍歷它們判斷是否是圖片類型,再將圖片信息寫入贪庙,最后保存為png格式文件蜘犁。
二、圖片提取
(一)引入相應的庫
import fitz #處理PDF
import re #使用正則表達式
import os #進行相關路徑的判斷
(二)導入PDF&創(chuàng)建導出圖片的文件夾
path = r"F: \pdfs\demo1.pdf" #導入的pdf的路徑
pic_path = r"F: \ima" #導出圖片的文件夾
if not os.path.exists(pic_path):
os.mkdir(pic_path)
else:
print("文件夾已存在插勤,不必重建沽瘦!")
doc = fitz.open(path) #打開pdf文件
lenXREF = doc.xrefLength()-1 #獲取對象數(shù)量長度
print(f"文件名:{path}, 頁數(shù): {doc.pageCount}, 對象: {lenXREF}") # 打印PDF的信息
運行結果為:
文件夾已存在革骨,不必重建!
文件名:F: \pdfs\demo1.pdf, 頁數(shù): 3, 對象: 54
xref
是cross-reference
的縮寫析恋。xref比現(xiàn)有對象的數(shù)量大一個良哲,所以可以用Document.xrefLength()-1
得到PDF文檔中的對象總數(shù)。結果顯示:demo1文檔有3頁助隧,54個對象筑凫。
(三)遍歷對象,定位圖片
for i in range(1, lenXREF):
print(i)
text = doc.xrefObject(i) #得到xref對象的相關信息
print(text)
部分結果如下:
image
可以看到其中記錄了每一個對象的信息并村。例如對象3巍实,它是一個圖片,text中記錄了它的type和subtype哩牍。我們利用subtype
標記為image
這一點棚潦,來定位圖片。
checkIM = r"/Subtype(?= */Image)" # 使用正則表達式來查找圖片
for i in range(1, lenXREF):
text = doc.xrefObject(i) # 定義對象字符串
isImage = re.search(checkIM, text) # 查看是否是image
if isImage:
print(i)
運行結果為:
3
4
7
32
這樣就定位到了文檔中的4張圖片膝昆。
(四)提取圖片
使用fitz.Pixmap(doc,xref)
函數(shù)創(chuàng)建pixmap
丸边。像素圖的屬性(寬度、高度等)將反映圖像的屬性荚孵。這里的xref要對應上面定位到的圖片的xref標號妹窖。使用pixmap對象的writePNG(filename)
函數(shù),可以將pixmap保存為png格式的圖片收叶。
imgcount = 0 # 圖片計數(shù)
for i in range(1, lenXREF):
text = doc.xrefObject(i) # 定義對象字符串
isImage = re.search(checkIM, text) # 查看是否是image
if not isImage: # 如果不是圖片骄呼,則進行下一個判斷
continue
imgcount += 1 #圖片計數(shù)
pix = fitz.Pixmap(doc, i) # 生成圖像對象
new_name = f"圖片{imgcount}.png" # 生成圖片的名稱
print(new_name)
pix.writePNG(os.path.join(pic_path, new_name))
pix = None
運行結果是:
圖片1.png
圖片2.png
圖片3.png
圖片4.png
去目標文件夾看一下,成功提取了相應的圖片:
image