Python利用Spire.PDF for Python庫抽取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)和豐富的庫,為我們提供了優(yōu)雅的解決方案。本文將深入探討如何利用Spire.PDF for Python庫,高效、準(zhǔn)確地從PDF文檔中提取文本,從而解放您的雙手,提升數(shù)據(jù)處理的自動(dòng)化水平。
為什么選擇Python進(jìn)行PDF文本提???
Python在數(shù)據(jù)處理和自動(dòng)化領(lǐng)域享有盛譽(yù),其優(yōu)勢在于:
- 生態(tài)系統(tǒng)豐富: 擁有眾多處理各種數(shù)據(jù)格式的庫,包括強(qiáng)大的PDF處理工具。
- 易學(xué)易用: 語法簡潔清晰,上手快,即使是初學(xué)者也能快速編寫腳本。
- 自動(dòng)化能力強(qiáng): 可以輕松集成到自動(dòng)化工作流中,實(shí)現(xiàn)批量處理。
相比于傳統(tǒng)的手動(dòng)提取,Python腳本能夠以極高的速度和一致性完成任務(wù),尤其是在面對大量PDF文件時(shí),其效率優(yōu)勢更為顯著。
認(rèn)識(shí)Spire.PDF for Python庫
Spire.PDF for Python是一個(gè)功能強(qiáng)大且專業(yè)的Python庫,專為PDF文檔的創(chuàng)建、編輯、轉(zhuǎn)換和解析而設(shè)計(jì)。在文本提取方面,它展現(xiàn)出以下顯著優(yōu)勢:
- 高精度文本提?。?/strong> 能夠準(zhǔn)確識(shí)別并提取PDF中的文本內(nèi)容,包括復(fù)雜的布局和字體。
- 支持多種PDF類型: 無論是原生PDF還是包含掃描圖像的PDF(通過內(nèi)置的OCR功能),它都能有效處理。
- 靈活的API調(diào)用: 提供了直觀且易于使用的API接口,方便開發(fā)者進(jìn)行各種操作。
- 處理復(fù)雜布局: 針對多列、表格、圖文混排等復(fù)雜布局的PDF,也能較好地保持文本的邏輯順序。
- 多語言支持: 能夠處理包含多種語言的文本。
安裝指南
在開始之前,請確保您已經(jīng)安裝了Spire.PDF for Python。如果尚未安裝,可以通過pip命令輕松完成:
pip install Spire.Pdf
基礎(chǔ)文本提?。簭腜DF文檔中獲取文本
提取整個(gè)PDF文檔的文本
最常見的需求是提取PDF文檔中的所有文本。Spire.PDF for Python提供了簡潔的方法來實(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對象
doc = PdfDocument()
# 加載PDF文件
doc.LoadFromFile(pdf_path)
# 用于存儲(chǔ)所有頁面的文本
full_text = ""
# 遍歷PDF文檔中的每一頁
for i in range(doc.Pages.Count):
page = doc.Pages.get_Item(i)
# 創(chuàng)建PdfTextExtractor對象
text_extractor = PdfTextExtractor(page)
# 提取當(dāng)前頁面的文本
# PdfTextExtractOptions可以用于配置提取行為,這里使用默認(rèn)設(shè)置
page_text = text_extractor.ExtractText(PdfTextExtractOptions())
full_text += page_text + "\n" # 添加換行符以分隔頁面內(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文檔對象。doc.LoadFromFile(pdf_path):加載指定的PDF文件。doc.Pages.Count:獲取PDF文檔的頁數(shù)。doc.Pages.get_Item(i):通過索引獲取特定頁面。PdfTextExtractor(page):為當(dāng)前頁面創(chuàng)建一個(gè)文本提取器。text_extractor.ExtractText(PdfTextExtractOptions()):執(zhí)行文本提取操作。PdfTextExtractOptions()可以用來控制提取行為,例如是否提取隱藏文本、文本提取方式等。
提取特定頁面的文本
有時(shí),我們只需要從PDF文檔的特定頁面中提取信息。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文檔的指定頁面提取文本并保存到TXT文件。
"""
if page_number < 1:
print("頁碼必須大于或等于1。")
return
doc = PdfDocument()
doc.LoadFromFile(pdf_path)
if page_number > doc.Pages.Count:
print(f"頁碼 {page_number} 超出文檔總頁數(shù) {doc.Pages.Count}。")
doc.Close()
return
# PDF頁碼是基于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} 頁的文本已成功從 {pdf_path} 提取并保存到 {output_txt_path}")
# 示例用法
extract_page_text(pdf_file, 2, "sample_page_2_text.txt") # 提取第2頁文本
進(jìn)階應(yīng)用:結(jié)構(gòu)化與區(qū)域文本提取
除了全文和單頁提取,Spire.PDF for Python還提供了更精細(xì)的控制,例如提取特定區(qū)域的文本,這對于從復(fù)雜文檔中獲取結(jié)構(gòu)化數(shù)據(jù)尤為有用。
提取PDF特定區(qū)域的文本
在許多場景下,我們可能只關(guān)心頁面上的某個(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文檔的指定頁面的特定區(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"無效頁碼 {page_number}。")
doc.Close()
return
page = doc.Pages.get_Item(page_number - 1)
# 定義提取區(qū)域 (RectangleF)
# 這里的坐標(biāo)系統(tǒng)通常以點(diǎn)為單位,原點(diǎn)在頁面左下角或左上角,
# 具體的原點(diǎn)位置和單位可能需要根據(jù)實(shí)際PDF和庫的實(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} 頁的指定區(qū)域提取文本并保存到 {output_txt_path}")
# 示例用法:假設(shè)我們想從第1頁的 (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)的測量工具來輔助定位。
處理表格數(shù)據(jù)提取
表格是PDF文檔中常見的結(jié)構(gòu)化數(shù)據(jù)形式。Spire.PDF for Python提供了識(shí)別和提取PDF中表格數(shù)據(jù)的功能,這對于自動(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è)表格對應(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 對象
table_extractor = PdfTableExtractor(doc)
# 查找頁面中的表格(True 表示自動(dòng)檢測)
tables = table_extractor.ExtractTable(i)
if tables:
print(f"在第 {i + 1} 頁找到 {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)檢測并提取指定頁面中的表格。table.GetRowCount()和table.GetColumnCount():獲取表格的行數(shù)和列數(shù)。table.GetText(row_index, column_index):獲取特定單元格的文本內(nèi)容。- 我們使用
pandas庫將提取到的表格數(shù)據(jù)轉(zhuǎn)換為DataFrame,并保存到Excel文件,這是一種常見的結(jié)構(gòu)化數(shù)據(jù)處理方式。
常見挑戰(zhàn)與Spire.PDF for Python的應(yīng)對
PDF文本提取并非總是一帆風(fēng)順,尤其是在面對復(fù)雜或質(zhì)量不佳的PDF文件時(shí)。
- 掃描件PDF的文本提取 (OCR功能): 傳統(tǒng)的文本提取庫對掃描件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支持多種語言的文本提取,這對于處理國際化文檔至關(guān)重要。其內(nèi)部機(jī)制能夠識(shí)別不同的字符編碼和字體。
- 布局混亂與非標(biāo)準(zhǔn)PDF: 對于布局異?;虿环螾DF規(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文檔中提取文本。無論是簡單的全文提取,還是復(fù)雜的區(qū)域和表格數(shù)據(jù)抽取,它都能提供可靠的解決方案。通過本文的詳細(xì)指導(dǎo)和代碼示例,您應(yīng)該已經(jīng)掌握了使用該庫進(jìn)行PDF文本提取的核心技能。
以上就是Python利用Spire.PDF for Python庫抽取PDF文檔文本的詳細(xì)內(nèi)容,更多關(guān)于Python抽取PDF文檔文本的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 如何創(chuàng)建一個(gè)簡單的REST接口
這篇文章主要介紹了Python 如何創(chuàng)建一個(gè)簡單的REST接口,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
python3實(shí)現(xiàn)二叉樹的遍歷與遞歸算法解析(小結(jié))
這篇文章主要介紹了python3實(shí)現(xiàn)二叉樹的遍歷與遞歸算法解析(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
flask中主動(dòng)拋出異常及統(tǒng)一異常處理代碼示例
這篇文章主要介紹了flask中主動(dòng)拋出異常及統(tǒng)一異常處理代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Python實(shí)現(xiàn)接口自動(dòng)化封裝導(dǎo)出excel和讀寫excel數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)接口自動(dòng)化封裝導(dǎo)出excel和讀寫excel數(shù)據(jù),文中的示例代碼簡潔易懂,希望對大家有所幫助2023-07-07
對Python中小整數(shù)對象池和大整數(shù)對象池的使用詳解
今天小編就為大家分享一篇對Python中小整數(shù)對象池和大整數(shù)對象池的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
使用python畫社交網(wǎng)絡(luò)圖實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于如何使用python畫社交網(wǎng)絡(luò)圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
(手寫)PCA原理及其Python實(shí)現(xiàn)圖文詳解
這篇文章主要介紹了Python來PCA算法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望能給你帶來幫助2021-08-08
python 讀取.csv文件數(shù)據(jù)到數(shù)組(矩陣)的實(shí)例講解
今天小編就為大家分享一篇python 讀取.csv文件數(shù)據(jù)到數(shù)組(矩陣)的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06

