Python利用Spire.PDF for Python庫(kù)抽取PDF文檔文本
在當(dāng)今數(shù)字化的世界中,PDF(Portable Document Format)無疑是最普遍的文檔格式之一。無論是報(bào)告、合同、發(fā)票還是學(xué)術(shù)論文,PDF都承載著海量的信息。然而,當(dāng)我們需要從這些PDF文檔中提取文本進(jìn)行數(shù)據(jù)分析、自動(dòng)化處理或信息檢索時(shí),手動(dòng)復(fù)制粘貼無疑是一項(xiàng)繁瑣且效率低下的任務(wù)。
幸運(yùn)的是,Python憑借其強(qiáng)大的生態(tài)系統(tǒng)和豐富的庫(kù),為我們提供了優(yōu)雅的解決方案。本文將深入探討如何利用Spire.PDF for Python庫(kù),高效、準(zhǔn)確地從PDF文檔中提取文本,從而解放您的雙手,提升數(shù)據(jù)處理的自動(dòng)化水平。
為什么選擇Python進(jìn)行PDF文本提???
Python在數(shù)據(jù)處理和自動(dòng)化領(lǐng)域享有盛譽(yù),其優(yōu)勢(shì)在于:
- 生態(tài)系統(tǒng)豐富: 擁有眾多處理各種數(shù)據(jù)格式的庫(kù),包括強(qiáng)大的PDF處理工具。
- 易學(xué)易用: 語法簡(jiǎn)潔清晰,上手快,即使是初學(xué)者也能快速編寫腳本。
- 自動(dòng)化能力強(qiáng): 可以輕松集成到自動(dòng)化工作流中,實(shí)現(xiàn)批量處理。
相比于傳統(tǒng)的手動(dòng)提取,Python腳本能夠以極高的速度和一致性完成任務(wù),尤其是在面對(duì)大量PDF文件時(shí),其效率優(yōu)勢(shì)更為顯著。
認(rèn)識(shí)Spire.PDF for Python庫(kù)
Spire.PDF for Python是一個(gè)功能強(qiáng)大且專業(yè)的Python庫(kù),專為PDF文檔的創(chuàng)建、編輯、轉(zhuǎn)換和解析而設(shè)計(jì)。在文本提取方面,它展現(xiàn)出以下顯著優(yōu)勢(shì):
- 高精度文本提?。?/strong> 能夠準(zhǔn)確識(shí)別并提取PDF中的文本內(nèi)容,包括復(fù)雜的布局和字體。
- 支持多種PDF類型: 無論是原生PDF還是包含掃描圖像的PDF(通過內(nèi)置的OCR功能),它都能有效處理。
- 靈活的API調(diào)用: 提供了直觀且易于使用的API接口,方便開發(fā)者進(jìn)行各種操作。
- 處理復(fù)雜布局: 針對(duì)多列、表格、圖文混排等復(fù)雜布局的PDF,也能較好地保持文本的邏輯順序。
- 多語言支持: 能夠處理包含多種語言的文本。
安裝指南
在開始之前,請(qǐng)確保您已經(jīng)安裝了Spire.PDF for Python。如果尚未安裝,可以通過pip命令輕松完成:
pip install Spire.Pdf
基礎(chǔ)文本提?。簭腜DF文檔中獲取文本
提取整個(gè)PDF文檔的文本
最常見的需求是提取PDF文檔中的所有文本。Spire.PDF for Python提供了簡(jiǎn)潔的方法來實(shí)現(xiàn)這一點(diǎn)。
from spire.pdf import *
from spire.pdf.common import *
def extract_full_text(pdf_path, output_txt_path):
"""
從PDF文檔中提取所有文本并保存到TXT文件。
"""
# 創(chuàng)建PdfDocument對(duì)象
doc = PdfDocument()
# 加載PDF文件
doc.LoadFromFile(pdf_path)
# 用于存儲(chǔ)所有頁(yè)面的文本
full_text = ""
# 遍歷PDF文檔中的每一頁(yè)
for i in range(doc.Pages.Count):
page = doc.Pages.get_Item(i)
# 創(chuàng)建PdfTextExtractor對(duì)象
text_extractor = PdfTextExtractor(page)
# 提取當(dāng)前頁(yè)面的文本
# PdfTextExtractOptions可以用于配置提取行為,這里使用默認(rèn)設(shè)置
page_text = text_extractor.ExtractText(PdfTextExtractOptions())
full_text += page_text + "\n" # 添加換行符以分隔頁(yè)面內(nèi)容
# 將提取的文本保存到文件
with open(output_txt_path, "w", encoding="utf-8") as f:
f.write(full_text)
# 關(guān)閉文檔
doc.Close()
print(f"文本已成功從 {pdf_path} 提取并保存到 {output_txt_path}")
# 示例用法
pdf_file = "sample.pdf" # 替換為您的PDF文件路徑
output_file = "sample_full_text.txt"
# 假設(shè)您有一個(gè)名為sample.pdf的文件
# extract_full_text(pdf_file, output_file)
提取結(jié)果示例:

代碼解釋:
PdfDocument():實(shí)例化一個(gè)PDF文檔對(duì)象。doc.LoadFromFile(pdf_path):加載指定的PDF文件。doc.Pages.Count:獲取PDF文檔的頁(yè)數(shù)。doc.Pages.get_Item(i):通過索引獲取特定頁(yè)面。PdfTextExtractor(page):為當(dāng)前頁(yè)面創(chuàng)建一個(gè)文本提取器。text_extractor.ExtractText(PdfTextExtractOptions()):執(zhí)行文本提取操作。PdfTextExtractOptions()可以用來控制提取行為,例如是否提取隱藏文本、文本提取方式等。
提取特定頁(yè)面的文本
有時(shí),我們只需要從PDF文檔的特定頁(yè)面中提取信息。Spire.PDF for Python同樣支持這一功能。
from spire.pdf import *
from spire.pdf.common import *
def extract_page_text(pdf_path, page_number, output_txt_path):
"""
從PDF文檔的指定頁(yè)面提取文本并保存到TXT文件。
"""
if page_number < 1:
print("頁(yè)碼必須大于或等于1。")
return
doc = PdfDocument()
doc.LoadFromFile(pdf_path)
if page_number > doc.Pages.Count:
print(f"頁(yè)碼 {page_number} 超出文檔總頁(yè)數(shù) {doc.Pages.Count}。")
doc.Close()
return
# PDF頁(yè)碼是基于0的索引,所以需要減1
page = doc.Pages.get_Item(page_number - 1)
text_extractor = PdfTextExtractor(page)
page_text = text_extractor.ExtractText(PdfTextExtractOptions())
with open(output_txt_path, "w", encoding="utf-8") as f:
f.write(page_text)
doc.Close()
print(f"第 {page_number} 頁(yè)的文本已成功從 {pdf_path} 提取并保存到 {output_txt_path}")
# 示例用法
extract_page_text(pdf_file, 2, "sample_page_2_text.txt") # 提取第2頁(yè)文本
進(jìn)階應(yīng)用:結(jié)構(gòu)化與區(qū)域文本提取
除了全文和單頁(yè)提取,Spire.PDF for Python還提供了更精細(xì)的控制,例如提取特定區(qū)域的文本,這對(duì)于從復(fù)雜文檔中獲取結(jié)構(gòu)化數(shù)據(jù)尤為有用。
提取PDF特定區(qū)域的文本
在許多場(chǎng)景下,我們可能只關(guān)心頁(yè)面上的某個(gè)特定區(qū)域(例如,發(fā)票上的總金額、報(bào)告中的摘要部分)。Spire.PDF for Python允許我們通過定義一個(gè)矩形區(qū)域來精確提取文本。
from spire.pdf import *
from spire.pdf.common import *
def extract_region_text(pdf_path, page_number, x, y, width, height, output_txt_path):
"""
從PDF文檔的指定頁(yè)面的特定區(qū)域提取文本。
坐標(biāo) (x, y) 為區(qū)域左上角,width 和 height 定義區(qū)域大小。
"""
doc = PdfDocument()
doc.LoadFromFile(pdf_path)
if page_number < 1 or page_number > doc.Pages.Count:
print(f"無效頁(yè)碼 {page_number}。")
doc.Close()
return
page = doc.Pages.get_Item(page_number - 1)
# 定義提取區(qū)域 (RectangleF)
# 這里的坐標(biāo)系統(tǒng)通常以點(diǎn)為單位,原點(diǎn)在頁(yè)面左下角或左上角,
# 具體的原點(diǎn)位置和單位可能需要根據(jù)實(shí)際PDF和庫(kù)的實(shí)現(xiàn)進(jìn)行調(diào)整。
# Spire.PDF通常使用左上角為原點(diǎn),單位為點(diǎn)。
extract_area = RectangleF.FromLTRB(x, y, x + width, y + height)
text_extractor = PdfTextExtractor(page)
options = PdfTextExtractOptions()
options.ExtractArea = extract_area # 設(shè)置提取區(qū)域
region_text = text_extractor.ExtractText(options)
with open(output_txt_path, "w", encoding="utf-8") as f:
f.write(region_text)
doc.Close()
print(f"從 {pdf_path} 第 {page_number} 頁(yè)的指定區(qū)域提取文本并保存到 {output_txt_path}")
# 示例用法:假設(shè)我們想從第1頁(yè)的 (100, 100) 位置開始,提取一個(gè) 200x50 的區(qū)域
pdf_file = "sample.pdf"
extract_region_text(pdf_file, 1, 20, 200, 200, 80, "sample_region_text.txt")
提取結(jié)果示例:

提示: 確定精確的x, y, width, height值可能需要一些嘗試,或者使用PDF閱讀器(如Adobe Acrobat)的測(cè)量工具來輔助定位。
處理表格數(shù)據(jù)提取
表格是PDF文檔中常見的結(jié)構(gòu)化數(shù)據(jù)形式。Spire.PDF for Python提供了識(shí)別和提取PDF中表格數(shù)據(jù)的功能,這對(duì)于自動(dòng)化數(shù)據(jù)錄入和分析至關(guān)重要。
from spire.pdf import *
from spire.pdf.common import *
import csv
import os
def extract_tables_from_pdf(pdf_path, output_dir):
"""
從PDF文檔中提取所有表格數(shù)據(jù),并分別保存為CSV文件。
每個(gè)表格對(duì)應(yīng)一個(gè)CSV文件。
"""
doc = PdfDocument()
doc.LoadFromFile(pdf_path)
# 如果輸出目錄不存在,則創(chuàng)建
if not os.path.exists(output_dir):
os.makedirs(output_dir)
table_count = 0
for i in range(doc.Pages.Count):
# 創(chuàng)建 PdfTableExtractor 對(duì)象
table_extractor = PdfTableExtractor(doc)
# 查找頁(yè)面中的表格(True 表示自動(dòng)檢測(cè))
tables = table_extractor.ExtractTable(i)
if tables:
print(f"在第 {i + 1} 頁(yè)找到 {len(tables)} 個(gè)表格。")
for table_index, table in enumerate(tables):
table_count += 1
# 構(gòu)造 CSV 文件名
csv_file_name = f"Page_{i + 1}_Table_{table_index + 1}.csv"
csv_file_path = os.path.join(output_dir, csv_file_name)
# 寫入 CSV 文件
with open(csv_file_path, mode="w", newline="", encoding="utf-8-sig") as csv_file:
writer = csv.writer(csv_file)
for row_index in range(table.GetRowCount()):
row_data = []
for column_index in range(table.GetColumnCount()):
cell_text = table.GetText(row_index, column_index)
row_data.append(cell_text)
writer.writerow(row_data)
print(f"表格已保存:{csv_file_path}")
doc.Close()
if table_count == 0:
print(f"未在 {pdf_path} 中找到任何表格。")
else:
print(f"共提取并保存了 {table_count} 個(gè)表格。")
# 示例用法
extract_tables_from_pdf("sample.pdf", "output_csv")
提取結(jié)果示例:

代碼解釋:
PdfTableExtractor(doc):創(chuàng)建表格提取器。table_extractor.ExtractTable(page_index):嘗試自動(dòng)檢測(cè)并提取指定頁(yè)面中的表格。table.GetRowCount()和table.GetColumnCount():獲取表格的行數(shù)和列數(shù)。table.GetText(row_index, column_index):獲取特定單元格的文本內(nèi)容。- 我們使用
pandas庫(kù)將提取到的表格數(shù)據(jù)轉(zhuǎn)換為DataFrame,并保存到Excel文件,這是一種常見的結(jié)構(gòu)化數(shù)據(jù)處理方式。
常見挑戰(zhàn)與Spire.PDF for Python的應(yīng)對(duì)
PDF文本提取并非總是一帆風(fēng)順,尤其是在面對(duì)復(fù)雜或質(zhì)量不佳的PDF文件時(shí)。
- 掃描件PDF的文本提取 (OCR功能): 傳統(tǒng)的文本提取庫(kù)對(duì)掃描件PDF無能為力,因?yàn)樗鼈儽举|(zhì)上是圖像。Spire.PDF for Python內(nèi)置了OCR(光學(xué)字符識(shí)別)功能,能夠識(shí)別圖像中的文字,從而實(shí)現(xiàn)掃描件PDF的文本提取。在
PdfTextExtractOptions中配置OCR相關(guān)參數(shù)即可啟用。 - 多語言文本處理: Spire.PDF for Python支持多種語言的文本提取,這對(duì)于處理國(guó)際化文檔至關(guān)重要。其內(nèi)部機(jī)制能夠識(shí)別不同的字符編碼和字體。
- 布局混亂與非標(biāo)準(zhǔn)PDF: 對(duì)于布局異常或不符合PDF規(guī)范的文檔,文本提取可能會(huì)遇到挑戰(zhàn)。Spire.PDF for Python通過其強(qiáng)大的解析引擎,盡可能地還原文本的邏輯結(jié)構(gòu),但在極端情況下,可能需要額外的后處理來完善提取結(jié)果。
- 異常處理和錯(cuò)誤管理: 在實(shí)際應(yīng)用中,文件損壞、權(quán)限問題等都可能導(dǎo)致提取失敗。建議在代碼中加入
try-except塊來捕獲和處理這些異常,提高程序的健壯性。
總結(jié)
Spire.PDF for Python為Python開發(fā)者提供了一套全面而強(qiáng)大的工具集,用于高效、準(zhǔn)確地從PDF文檔中提取文本。無論是簡(jiǎn)單的全文提取,還是復(fù)雜的區(qū)域和表格數(shù)據(jù)抽取,它都能提供可靠的解決方案。通過本文的詳細(xì)指導(dǎo)和代碼示例,您應(yīng)該已經(jīng)掌握了使用該庫(kù)進(jìn)行PDF文本提取的核心技能。
以上就是Python利用Spire.PDF for Python庫(kù)抽取PDF文檔文本的詳細(xì)內(nèi)容,更多關(guān)于Python抽取PDF文檔文本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django基于ORM操作數(shù)據(jù)庫(kù)的方法詳解
這篇文章主要介紹了Django基于ORM操作數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式總結(jié)分析了Django使用ORM操作數(shù)據(jù)庫(kù)的相關(guān)配置、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
在Python中使用Neo4j數(shù)據(jù)庫(kù)的教程
這篇文章主要介紹了在Python中使用Neo4j數(shù)據(jù)庫(kù)的教程,Neo4j是一個(gè)具有一定人氣的非關(guān)系型的數(shù)據(jù)庫(kù),需要的朋友可以參考下2015-04-04
Python實(shí)現(xiàn)大模型Function Calling的實(shí)戰(zhàn)指南
大模型很聰明,但它有個(gè)致命缺陷:只能說,不能做,Function Calling 徹底打破了這道墻,本文將用 Python 從零實(shí)現(xiàn) Function Calling,讓大模型不僅能思考,還能調(diào)用真實(shí)工具完成任務(wù),需要的朋友可以參考下2026-05-05
Python Pandas創(chuàng)建Dataframe數(shù)據(jù)框的六種方法匯總
這篇文章主要介紹了Python中的Pandas創(chuàng)建Dataframe數(shù)據(jù)框的六種方法,創(chuàng)建Dataframe主要是使用pandas中的DataFrame函數(shù),其核心就是第一個(gè)參數(shù):data,傳入原始數(shù)據(jù),因此我們可以據(jù)此給出六種創(chuàng)建Dataframe的方法,需要的朋友可以參考下2023-05-05
python?flask框架中多種查詢參數(shù)的獲取方式
這篇文章主要介紹了pythonflask框架的生命周期以及多種查詢參數(shù)的獲取方式,文章通過代碼示例和圖文講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03
基于Python Watchdog庫(kù)實(shí)現(xiàn)文件系統(tǒng)監(jiān)控
Watchdog是一個(gè)優(yōu)秀的Python庫(kù),用于監(jiān)控文件系統(tǒng)事件,本文將介紹Watchdog的基本用法,并通過一個(gè)實(shí)際案例展示如何用它來監(jiān)控下載目錄并自動(dòng)轉(zhuǎn)換ICO文件為PNG格式2025-07-07
Python?opencv圖像膨脹與腐蝕處理實(shí)例探究
這篇文章主要介紹了Python?opencv圖像膨脹與腐蝕處理實(shí)例探究2024-01-01

