python 三種方法提取pdf中的圖片
有時我們需要將一份或者多份PDF文件中的圖片提取出來,如果采取在線的網(wǎng)站實現(xiàn)的話又擔(dān)心圖片泄漏,手動操作又覺得麻煩,其實用Python也可以輕松搞定!
今天就跟大家系統(tǒng)分享幾種Python提取 PDF 圖片的方法。其實沒有非常完美的方法,每種方法提取效率都不是百分之百,因此可以考慮用多種方法進行互補,主要將涉及:
- 基于
fitz
庫和正則搜索提取圖片 - 基于
pdf2image
庫的兩種方法提取圖片
基于 fitz 庫和正則搜索
fitz 是 pymupdf 的子模塊,需要先用命令行安裝 pymupdf:
pip install pymupdf
但注意導(dǎo)入時使用 import fitz
導(dǎo)入模塊!
下面的代碼就利用 fitz
庫提取圖片需要通過正則匹配圖片元素,將模板元素轉(zhuǎn)化為像素后再以圖片形式寫出
import fitz import re import os file_path = r'C:\xxx\xxx.pdf' # PDF 文件路徑 dir_path = r'C:\xxx' # 存放圖片的文件夾 def pdf2image1(path, pic_path): checkIM = r"/Subtype(?= */Image)" pdf = fitz.open(path) lenXREF = pdf._getXrefLength() count = 1 for i in range(1, lenXREF): text = pdf._getXrefString(i) isImage = re.search(checkIM, text) if not isImage: continue pix = fitz.Pixmap(pdf, i) new_name = f"img_{count}.png" pix.writePNG(os.path.join(pic_path, new_name)) count += 1 pix = None pdf2image1(file_path, dir_path)
運行提取示例文件后結(jié)果如下:
可以看到,有一些很小的色塊也被提取成圖片,那么怎么過濾掉它們呢?
有一個簡單的方法是通過大小過濾,pix 像素在 fitz 庫中存在一個重要的方法 pix.size 可以反映像素多少,簡單的色素塊該值較低,可以通過設(shè)置一個閾值過濾。以閾值 10000 為例過濾:
import fitz import re import os file_path = r'C:\xxx\xxx.pdf' # PDF 文件路徑 dir_path = r'C:\xxx' # 存放圖片的文件夾 def pdf2image1(path, pic_path): checkIM = r"/Subtype(?= */Image)" pdf = fitz.open(path) lenXREF = pdf._getXrefLength() count = 1 for i in range(1, lenXREF): text = pdf._getXrefString(i) isImage = re.search(checkIM, text) if not isImage: continue pix = fitz.Pixmap(pdf, i) if pix.size < 10000: # 在這里添加一處判斷一個循環(huán) continue # 不符合閾值則跳過至下 new_name = f"img_{count}.png" pix.writePNG(os.path.join(pic_path, new_name)) count += 1 pix = None pdf2image1(file_path, dir_path)
可以看到,全部圖片都被正常提??!
基于 pdf2image 庫的兩種方法
一看名字就知道這個庫的用處了,官方文檔為https://www.cnpython.com/pypi/pdf2image
可以簡單通過 pip install pdf2image
安裝,但poppler才是真正起做用的轉(zhuǎn)換器,因此需要額外安裝和配置:
- windows用戶必須安裝
poppler for Windows
,然后將bin/文件夾添加到PATH - Mac用戶必須安裝
poppler for Mac
具體發(fā)揮作用的代碼官方文檔也給出了詳細的說明:
那么我們就分別嘗試這兩種方法:
from pdf2image import convert_from_path,convert_from_bytes import tempfile from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError import os file_path = r'C:\xxx\xxx.pdf' # PDF 文件路徑 dir_path = r'C:\xxx' # 存放圖片的文件夾 def pdf2image2(file_path, dir_path): images = convert_from_path(file_path, dpi=200) for image in images: if not os.path.exists(dir_path): os.makedirs(dir_path) image.save(file_path + f'\img_{images.index(image)}.png', 'PNG') pdf2image2(file_path, dir_path)
可以成功提取圖片。再試試第二種方法:
from pdf2image import convert_from_path,convert_from_bytes import tempfile from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError import os file_path = r'C:\xxx\xxx.pdf' # PDF 文件路徑 dir_path = r'C:\xxx' # 存放圖片的文件夾 def pdf2image3(file_path, dir_path): images = convert_from_bytes(open(file_path, 'rb').read()) for image in images: if not os.path.exists(dir_path): os.makedirs(dir_path) image.save(file_path + f'\img_{images.index(image)}.png', 'PNG') pdf2image3(file_path, dir_path)
可以看到結(jié)果和之前一致,PDF中全部圖片都被提取出來!
再補充一下。核心方法covert_from_bytes
包含大量參數(shù),可以自行修改。幾個常用參數(shù)總結(jié)如下:
參數(shù) |
意義 |
---|---|
pdf_path |
PDF 文檔路徑 |
dpi |
圖像質(zhì)量(如果是學(xué)術(shù)期刊雜志常見 300dpi) |
output_folder |
將生成的圖像寫入文件夾(而不是直接寫入內(nèi)存) |
first_page |
起始轉(zhuǎn)換頁數(shù) |
last_page |
轉(zhuǎn)換至哪一頁 |
fmt |
圖像格式,可以指定為 png,默認為 ppm |
thread_count |
允許參與轉(zhuǎn)換的線程數(shù) |
userpw |
PDF 的密碼 |
output_file |
輸出文件名 |
poppler_path |
指定 poppler 的安裝路徑,一開始配置好就無需指定 |
值得一提的是thread_count
參數(shù),可以啟動多線程會大大加快轉(zhuǎn)換速度,尤其是 PDF 頁面較多時。有興趣的讀者可以做嘗試。
以上就是python 三種方法提取pdf中的圖片的詳細內(nèi)容,更多關(guān)于python 提取pdf中的圖片的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
keras model.fit 解決validation_spilt=num 的問題
這篇文章主要介紹了keras model.fit 解決validation_spilt=num 的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python創(chuàng)建Getter和Setter的方法詳解
Getters?和?Setters?是幫助我們設(shè)置類變量或?qū)傩远鵁o需直接訪問的方法,這篇文章主要和大家介紹了如何在Python中創(chuàng)建Getter和Setter,需要的可以參考下2023-10-10提升Python Web應(yīng)用性能的10個關(guān)鍵技巧
Python作為一種強大的編程語言,在Web開發(fā)領(lǐng)域也有著廣泛的應(yīng)用,通過結(jié)合Python的靈活性和一些高性能的框架和工具,我們可以構(gòu)建出高性能的Web應(yīng)用程序,本文將介紹一些關(guān)鍵的技術(shù)和方法,幫助你在Python環(huán)境下構(gòu)建高性能的Web應(yīng)用程序,需要的朋友可以參考下2024-07-07基于Python Numpy的數(shù)組array和矩陣matrix詳解
下面小編就為大家分享一篇基于Python Numpy的數(shù)組array和矩陣matrix詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python實現(xiàn)批量上傳本地maven庫到nexus
這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)批量上傳本地maven庫到nexus,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的小伙伴可以參考下2024-01-01使用Python設(shè)置Excel單元格數(shù)字的顯示格式
Python語言可以幫助我們靈活設(shè)置Excel單元格的數(shù)字格式,保證數(shù)據(jù)的一致性與專業(yè)標(biāo)準(zhǔn),本文將介紹如何使用Python對Excel工作表中單元格的數(shù)字格式進行設(shè)置,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下2024-06-06