Python實(shí)現(xiàn)讀取PDF并提取文本和圖片
在日常工作和學(xué)習(xí)中,我們經(jīng)常會遇到需要從 PDF 文件中批量提取文本或圖片的情況。比如,整理一份掃描版合同中的條款,或者收集一份產(chǎn)品手冊里所有的配圖。
之前處理 PDF 可能會讓人感到頭疼,但有了合適的庫,這一切都變得簡單。今天,我們將介紹如何使用 Spire.PDF for Python 這個強(qiáng)大的庫,僅需幾行代碼,就能輕松搞定 PDF 中的文本和圖片提取)。

在開始之前,請確保你已經(jīng)安裝了 Spire.PDF 庫:
pip install Spire.PDF
1. 加載 PDF 文檔
在進(jìn)行任何操作之前,首先需要將 PDF 文件加載到我們的代碼中。Spire.PDF 非常靈活,支持 從文件路徑加載 ,也支持 從數(shù)據(jù)流(Stream)加載 。
方式一:從文件加載
這是最直接的方式,適用于本地磁盤上的固定文件。
from spire.pdf import PdfDocument
# 創(chuàng)建一個 PdfDocument 實(shí)例
pdf = PdfDocument()
# 加載本地的 PDF 文檔
pdf.LoadFromFile("sample.pdf")
方式二:從數(shù)據(jù)流加載
如果你的 PDF 數(shù)據(jù)是從網(wǎng)絡(luò)接口接收到的,或者是通過其他方式在內(nèi)存中生成的字節(jié)數(shù)據(jù),這種方式就非常實(shí)用。
from spire.pdf import PdfDocument, Stream
# 將文件讀取為字節(jié)數(shù)組(這里演示從文件讀,實(shí)際也可以來自網(wǎng)絡(luò))
with open("sample.pdf", "rb") as f:
byte_data = f.read()
# 創(chuàng)建數(shù)據(jù)流對象
pdfStream = Stream(byte_data)
# 從流中加載 PDF
pdf = PdfDocument(pdfStream)
2. 提取文本
文本提取是處理文檔最常用的功能之一。下面的代碼演示了如何遍歷 PDF 的所有頁面,并將每一頁的文本拼接起來。
主要用到 PdfTextExtractor 和 PdfTextExtractOptions 這兩個輔助類。設(shè)置 IsExtractAllText = True 可以確保提取出頁面上的大部分可見文本。
# 假設(shè) pdf 對象已經(jīng)通過上面的方式加載完成
all_text = ""
# 循環(huán)遍歷每一頁
for pageIndex in range(pdf.Pages.Count):
# 根據(jù)索引獲取當(dāng)前頁
page = pdf.Pages.get_Item(pageIndex)
# 創(chuàng)建文本提取器
text_extractor = PdfTextExtractor(page)
# 配置提取選項(xiàng)
options = PdfTextExtractOptions()
options.IsExtractAllText = True
options.IsSimpleExtraction = True
# 執(zhí)行提取并累加
all_text += text_extractor.ExtractText(options)
# 打印結(jié)果
print(all_text)
3. 提取圖片
很多時候,PDF 里的關(guān)鍵信息其實(shí)藏在插圖或圖表里。Spire.PDF 同樣為我們準(zhǔn)備了非常便捷的圖片提取方案。
通過 PdfImageHelper 幫助類,我們可以直接獲取頁面上的圖片信息,然后一鍵保存為圖片文件(如 .png 格式)。
# 獲取第一頁(索引為0)
page = pdf.Pages.get_Item(0)
# 創(chuàng)建圖片輔助對象
image_helper = PdfImageHelper()
# 獲取該頁面上的所有圖片信息
images_info = image_helper.GetImagesInfo(page)
# 遍歷并保存每一張圖片
for i in range(len(images_info)):
# 保存為 PNG 格式
images_info[i].Image.Save(f"output/Images/image_{i}.png")
print(f"成功提取 {len(images_info)} 張圖片")
注意 :如果是掃描件(圖片型 PDF),提取出來的其實(shí)是一整張掃描圖;如果是電子文檔生成的 PDF,則能精準(zhǔn)提取出嵌入的獨(dú)立圖標(biāo)或照片。
4. 進(jìn)階提示
雖然上述代碼已經(jīng)覆蓋了基礎(chǔ)需求,但在實(shí)際應(yīng)用中還有幾點(diǎn)值得注意:
- 分頁處理 :示例中為了演示,提取了所有文本。如果你想按頁處理,只需在循環(huán)中控制
pageIndex即可。 - 中文支持 :該庫對中文支持良好,提取中文 PDF 時只要保持編碼環(huán)境為 UTF-8 即可。
- 免費(fèi)版限制 :如果你使用的是免費(fèi)版的 Spire.PDF,請注意它通常對處理的頁數(shù)有限制(例如僅支持前 10 頁)。如果需要處理頁數(shù)較多的文檔,可能需要評估商業(yè)版。
5.方法補(bǔ)充
提取 PDF 中的文本和圖片,關(guān)鍵在于根據(jù)文檔類型和需求選擇合適的庫。如果追求通用與平衡,PyMuPDF (fitz) 是首選:它速度極快,能同時完美提取文本和圖片,且支持對掃描版 PDF 進(jìn)行光學(xué)字符識別 (OCR)。
主流 Python PDF 提取工具對比
| 庫名 | 核心特長 | 處理速度 | 推薦指數(shù) | 最佳適用場景 |
|---|---|---|---|---|
| PyMuPDF (fitz) | 全能、高速、穩(wěn)定 | 極快 | ★★★★★ | 大多數(shù)通用場景,尤其是需要同時提取文本和圖片時。 |
| pdfplumber | 表格提取精準(zhǔn)、API 友好 | 較慢 | ★★★★☆ | 處理需要精確提取復(fù)雜表格的金融、數(shù)據(jù)類報告。 |
| pdf-oxide | 極致性能 | 最快 | ★★★★☆ | 性能瓶頸項(xiàng)目、大規(guī)模批量處理;純文本提取極快。 |
| pypdf | 輕量、功能基礎(chǔ) | 一般 | ★★★☆☆ | 僅需快速提取純文本或合并、拆分 PDF 等操作。 |
| pdfminer.six | 布局分析準(zhǔn)確 | 一般 | ★★☆☆☆ | 需要深入了解頁面布局坐標(biāo),且有能力二次開發(fā)的場景。 |
如果你的 PDF 是掃描件(由圖片組成),PyMuPDF 仍是首選,因?yàn)樗闪?OCR 功能。對于純文本提取速度有極致要求,可以嘗試新的高性能庫 pdf-oxide。
這里用最小化代碼來演示最核心的三個庫。
1. PyMuPDF (fitz) - 全能首選
PyMuPDF 是處理 PDF 的瑞士軍刀,以其卓越的性能和對文本、圖片完美支持而聞名。
安裝:
pip install PyMuPDF
提取文本和圖片的完整示例:
下面的代碼展示了如何打開一個 PDF 文件,遍歷每一頁,提取其中的所有文本,并將頁面上的所有圖片保存下來。
import fitz # PyMuPDF 的導(dǎo)入名
def extract_text_and_images(pdf_path):
"""從PDF中提取文本并保存所有圖片"""
doc = fitz.open(pdf_path)
full_text = ""
for page_num in range(len(doc)):
page = doc[page_num]
# 1. 提取當(dāng)前頁的文本
page_text = page.get_text()
full_text += page_text
# 2. 提取當(dāng)前頁的圖片
image_list = page.get_images(full=True)
for img_index, img in enumerate(image_list):
xref = img[0] # 圖片的引用ID
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
image_ext = base_image["ext"] # 圖片擴(kuò)展名,如 'png', 'jpeg'
with open(f"image_page{page_num+1}_{img_index}.{image_ext}", "wb") as img_file:
img_file.write(image_bytes)
doc.close()
return full_text
# 使用示例
text_content = extract_text_and_images("your_document.pdf")
print(text_content[:500]) # 打印前500個字符2. pdfplumber - 表格提取的利器
當(dāng)你的 PDF 包含表格時,pdfplumber 的 extract_table() 方法非常強(qiáng)大,可以智能解析并提取表格結(jié)構(gòu)。
安裝:
pip install pdfplumber
提取表格并打印:
import pdfplumber
with pdfplumber.open("table_file.pdf") as pdf:
first_page = pdf.pages[0]
# 嘗試自動識別并提取頁面上的第一個表格
table = first_page.extract_table()
if table:
for row in table:
print(row) # 打印表格的每一行3. pypdf - 簡單文本提取
如果你只需要提取純文本,不關(guān)心圖片和格式,pypdf 是一個輕量級的選擇。
安裝:
pip install pypdf
基礎(chǔ)文本提取:
from pypdf import PdfReader
reader = PdfReader("example.pdf")
text = ""
for page in reader.pages:
text += page.extract_text()
print(text)進(jìn)階技巧:處理掃描版 PDF(OCR)
如果 PDF 是掃描件或圖片型 PDF(無法直接選中文字),PyMuPDF 內(nèi)部集成了對 Tesseract 的支持。
import pymupdf
doc = pymupdf.open("scanned.pdf")
for page in doc:
# 獲取 OCR 文本頁,如果已有文本層,常規(guī)方法也能拿到
tp = page.get_textpage_ocr()
text = page.get_text(textpage=tp)
print(text)6.總結(jié)
通過 Spire.PDF for Python,你會發(fā)現(xiàn)處理 PDF 文件變得如此簡單。無論是讀取文件、逐頁分析文字,還是把珍貴的插圖保存下來,只需要短短的十幾行代碼就能搞定。這大大提升了文檔處理的效率,讓你能專注于下一步的數(shù)據(jù)分析或業(yè)務(wù)邏輯。
現(xiàn)在就去試試吧,用代碼解放你的雙手!
到此這篇關(guān)于Python實(shí)現(xiàn)讀取PDF并提取文本和圖片的文章就介紹到這了,更多相關(guān)Python提取PDF文本和圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python實(shí)現(xiàn)一鍵提取PDF文件中的文本、表格和圖片
- Python調(diào)用Tika實(shí)現(xiàn)一站式提取PDF/Word/Excel
- Python利用PyMuPDF實(shí)現(xiàn)高效提取PDF文本與圖片
- Python使用PyPDF2實(shí)現(xiàn)快速提取PDF文本
- Python基于OpenAI?API輕松實(shí)現(xiàn)PDF發(fā)票信息提取
- python實(shí)現(xiàn)PDF文檔提取,分割與合并操作
- Python實(shí)現(xiàn)PDF信息的精準(zhǔn)提取與結(jié)構(gòu)化輸出
- Python實(shí)現(xiàn)高效提取PDF中的表格數(shù)據(jù)并導(dǎo)出為 TXT或Excel
- Python快速實(shí)現(xiàn)從PDF中提取文本與圖像坐標(biāo)的終極指南
相關(guān)文章
淺談Python中range與Numpy中arange的比較
這篇文章主要介紹了淺談Python中range與Numpy中arange的比較,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python實(shí)現(xiàn)感知機(jī)線性分類模型示例代碼
這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)感知機(jī)線性分類模型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
python嵌套字典比較值與取值的實(shí)現(xiàn)示例
這篇文章主要給大家介紹了關(guān)于python嵌套字典比較值與取值的實(shí)現(xiàn)方法,詳細(xì)介紹了python字典嵌套字典的情況下獲取某個key的value的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。2017-11-11
python如何用columns參數(shù)獲取DataFrame各列的表頭名
這篇文章主要介紹了python如何用columns參數(shù)獲取DataFrame各列的表頭名問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
Python環(huán)境搭建以及Python與PyCharm安裝詳細(xì)圖文教程
PyCharm是一種PythonIDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高其效率的工具,這篇文章主要給大家介紹了關(guān)于Python環(huán)境搭建以及Python與PyCharm安裝的詳細(xì)圖文教程,需要的朋友可以參考下2024-03-03
Python中往列表中插入字典時,數(shù)據(jù)重復(fù)問題
這篇文章主要介紹了Python中往列表中插入字典時,數(shù)據(jù)重復(fù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02

