Python實現(xiàn)一鍵提取PDF文件中的文本、表格和圖片
PDF 文檔作為一種廣泛使用的文件格式,常常包含豐富的內容元素——從簡單的文字段落,到復雜的數(shù)據(jù)表格,再到精美的圖片和圖表。當我們需要對這些內容進行二次利用或數(shù)據(jù)分析時,如何高效地從 PDF 中提取這些不同類型的元素就成為了一個關鍵問題。
本文將介紹如何使用 Python 和 Spire.PDF 庫來提取 PDF 文件中的文本、表格和圖片,幫助您將靜態(tài)的 PDF 文檔轉換為可編輯、可分析的數(shù)據(jù)資源。
為什么需要提取 PDF 內容?
從 PDF 中提取內容在實際工作中有著廣泛的應用場景:
- 數(shù)據(jù)再利用:從報告或文檔中提取文本內容,用于其他文檔或系統(tǒng)
- 數(shù)據(jù)分析:提取表格數(shù)據(jù)進行統(tǒng)計分析或導入數(shù)據(jù)庫
- 素材收集:提取圖片用于演示文稿、網(wǎng)站或其他設計項目
- 內容歸檔:將 PDF 內容轉換為結構化格式便于檢索和管理
- 自動化處理:批量提取多個文檔的內容,提高工作效率
通過 Python 自動化這些提取操作,可以顯著減少手動復制粘貼的工作量,并提高數(shù)據(jù)處理的準確性。
環(huán)境準備
首先,需要安裝 Spire.PDF for Python 庫??梢酝ㄟ^ pip 命令輕松完成安裝:
pip install Spire.PDF
安裝完成后,即可在 Python 腳本中導入該庫并使用其提供的內容提取功能。
提取 PDF 中的文本
提取整頁文本
最基礎的提取操作是從 PDF 頁面中提取所有文本內容。Spire.PDF 提供了 PdfTextExtractor 類來實現(xiàn)這一功能,它能夠智能識別頁面中的文本布局并保持原有的閱讀順序。
以下代碼展示了如何從 PDF 的第一頁提取文本并保存到文件:
from spire.pdf.common import *
from spire.pdf import *
def WriteAllText(fname: str, text: List[str]):
"""輔助函數(shù):將文本列表寫入文件"""
fp = open(fname, "w", encoding="utf-8")
for s in text:
fp.write(s)
fp.close()
# 定義輸入和輸出文件路徑
inputFile = "./Demos/Data/PDFTemplate-Az.pdf"
outputFile = "ExtractTextFromParticularPage.txt"
# 創(chuàng)建 PDF 文檔對象
doc = PdfDocument()
# 加載 PDF 文件
doc.LoadFromFile(inputFile)
# 獲取第一頁
page = doc.Pages[0]
# 創(chuàng)建文本提取器并保持空白格式
textExtractor = PdfTextExtractor(page)
option = PdfTextExtractOptions()
text = textExtractor.ExtractText(option)
# 將提取的文本寫入文件
WriteAllText(outputFile, text)
doc.Close()

這個示例展示了文本提取的基本流程:
- 加載 PDF 文檔并獲取目標頁面
- 創(chuàng)建
PdfTextExtractor對象用于文本提取 - 配置
PdfTextExtractOptions選項(可選) - 調用
ExtractText方法提取文本內容 - 將結果保存到文本文件
PdfTextExtractOptions 允許您自定義提取行為,例如是否保留空白字符、如何處理換行符等,這為不同場景下的文本提取提供了靈活性。
提取特定區(qū)域的文本
有時候我們只對 PDF 頁面中的某個特定區(qū)域感興趣,比如表單字段、標題部分或某個數(shù)據(jù)塊。Spire.PDF 支持通過定義矩形區(qū)域來精確提取指定范圍內的文本。
以下示例演示了如何從頁面的特定矩形區(qū)域提取文本:
from spire.pdf.common import *
from spire.pdf import *
def WriteAllText(fname: str, text: List[str]):
"""輔助函數(shù):將文本寫入文件"""
fp = open(fname, "w", encoding="utf-8")
for s in text:
fp.write(s)
fp.close()
# 定義輸入和輸出文件路徑
inputFile = "/輸入文檔.pdf"
outputFile = "ExtractTextFromSpecificArea.txt"
# 加載 PDF 文件
pdf = PdfDocument()
pdf.LoadFromFile(inputFile)
# 獲取第一頁
page = pdf.Pages[0]
# 從頁面的特定矩形區(qū)域提取文本
# RectangleF 參數(shù):x坐標, y坐標, 寬度, 高度
pdfTextExtractor = PdfTextExtractor(page)
pdfTextExtractOptions = PdfTextExtractOptions()
pdfTextExtractOptions.ExtractArea = RectangleF(80.0, 180.0, 500.0, 200.0)
text = pdfTextExtractor.ExtractText(pdfTextExtractOptions)
# 保存文本到文件
sb = []
sb.append(text)
WriteAllText(outputFile, sb)
pdf.Close()
這段代碼的關鍵在于 RectangleF 參數(shù)的設置:
- x坐標和y坐標:定義矩形區(qū)域左上角的位置(單位為點,1點=1/72英寸)
- 寬度和高度:定義提取區(qū)域的大小
通過精確控制這些參數(shù),您可以只提取感興趣的區(qū)域,避免獲取無關內容。這種方法特別適合處理結構化的 PDF 表單、發(fā)票或報表。
提取 PDF 中的圖片
PDF 文檔中的圖片可能是產品照片、圖表、Logo 或其他視覺元素。Spire.PDF 提供了高效的方法來提取這些圖片,最常用的方式是借助 PdfImageHelper 工具類。
使用 PdfImageHelper 提取圖片
以下代碼展示了如何遍歷 PDF 頁面中的所有圖片并將其保存為單獨的 PNG 文件:
from spire.pdf.common import *
from spire.pdf import *
# 創(chuàng)建 PdfDocument 對象
doc = PdfDocument()
# 加載 PDF 文檔
doc.LoadFromFile("輸入文檔.pdf")
# 創(chuàng)建 PdfImageHelper 對象
image_helper = PdfImageHelper()
image_count = 1
# 遍歷文檔中的頁面
for i in range(doc.Pages.Count):
# 獲取當前頁面中的圖片信息集合
images_info = image_helper.GetImagesInfo(doc.Pages[i])
# 遍歷圖片信息并保存圖片
for j in range(len(images_info)):
image_info = images_info[j]
# 設置輸出文件名
output_file = f"圖片-{image_count}.png"
# 直接通過 Image 對象保存文件
image_info.Image.Save(output_file)
image_count += 1
doc.Close()

核心步驟說明:
- 實例化 PdfImageHelper:這是提取圖片的核心輔助類。
- 獲取圖片信息:通過
image_helper.GetImagesInfo(page)獲取包含圖片數(shù)據(jù)及其元數(shù)據(jù)的集合。 - 直接保存:利用
image_info.Image.Save()方法直接將圖片對象導出。Spire.PDF 會自動處理圖像解碼,確保提取出的圖片保持高質量。
同時提取文本和圖片
如果需要一次性獲取頁面中的所有內容,可以將 PdfTextExtractor 與 PdfImageHelper 結合使用。這種方法非常適合需要對文檔進行內容索引或歸檔的自動化任務。
from spire.pdf import *
import os
inputFile = "./Demos/Data/Extraction.pdf"
# 創(chuàng)建 PDF 文檔
doc = PdfDocument()
doc.LoadFromFile(inputFile)
# 創(chuàng)建緩沖區(qū)存儲提取的文本
sbuffer = []
# 定義圖片對象數(shù)組用于緩存
images = []
# 實例化 PdfImageHelper
imageHelper = PdfImageHelper()
# 遍歷文檔中的每一頁
for i in range(doc.Pages.Count):
page = doc.Pages.get_Item(i)
# 創(chuàng)建 PdfTextExtractor 對象并提取文本
pdfTextExtractor = PdfTextExtractor(page)
pdfTextExtractOptions = PdfTextExtractOptions()
sbuffer.append(pdfTextExtractor.ExtractText(pdfTextExtractOptions))
# 獲取頁面中的所有圖片并存入緩存
imageInfo = imageHelper.GetImagesInfo(page)
for info in imageInfo:
images.append(info.Image)
# 保存提取的文本到文件
fileName = "Extraction.txt"
with open(fileName, "w", encoding="utf-8") as fp:
for s in sbuffer:
fp.write(s + "\n")
# 保存頁面中的所有圖片
for index, img in enumerate(images):
img_path = os.path.join("./Demos/Data", f"Image-{index}.png")
img.Save(img_path)
# 關閉文檔
doc.Close()
這種方法的優(yōu)勢在于可以統(tǒng)一處理文檔的各種媒體元素,并能夠通過循環(huán)結構輕松實現(xiàn)批量提取,是處理復雜 PDF 文檔的標準做法。
提取 PDF 中的表格
表格是 PDF 文檔中常見的數(shù)據(jù)結構,但也是最難準確提取的元素之一。Spire.PDF 提供了將 PDF 轉換為 Excel 的功能,通過這種方式可以間接提取表格數(shù)據(jù)。
提取 PDF 表格并保存為數(shù)據(jù)文件
通過 PdfTableExtractor 類,可以精確識別并提取 PDF 中的表格結構。這種方法允許開發(fā)者遍歷每一行和每一列,將數(shù)據(jù)按原樣填入 Excel 工作表或保存為 CSV 格式,便于后續(xù)的數(shù)據(jù)處理。
from spire.pdf import *
from spire.pdf.common import *
from spire.xls import *
# 創(chuàng)建 PdfDocument 對象
doc = PdfDocument()
# 加載 PDF 文檔
doc.LoadFromFile("/input/項目進度.pdf")
# 創(chuàng)建 Workbook 對象
workbook = Workbook()
# 清除默認工作表
workbook.Worksheets.Clear()
# 創(chuàng)建 PdfTableExtractor 對象
extractor = PdfTableExtractor(doc)
sheetNumber = 1
# 遍歷 PDF 文件中的頁面
for pageIndex in range(doc.Pages.Count):
# 從當前頁面提取表格
tableList = extractor.ExtractTable(pageIndex)
# 遍歷表格
if tableList is not None and len(tableList) > 0:
for table in tableList:
# 為當前表格添加一個工作表
sheet = workbook.Worksheets.Add(f"Sheet{sheetNumber}")
# 獲取表格的行數(shù)和列數(shù)
row = table.GetRowCount()
column = table.GetColumnCount()
# 遍歷表格的行和列
for i in range(row):
for j in range(column):
# 獲取當前單元格中的文本
text = table.GetText(i, j)
# 將文本寫入工作表的指定單元格
sheet.Range[i + 1, j + 1].Value = text
sheetNumber += 1
# 將工作簿保存為 CSV 文件
workbook.SaveToFile("/output/提取表格.csv", FileFormat.CSV)
workbook.Dispose()
doc.Close()

核心步驟說明:
- 初始化提取器:使用
PdfTableExtractor(doc)實例化表格提取對象。 - 按頁提取:通過
extractor.ExtractTable(pageIndex)獲取特定頁面的所有表格。 - 行列遍歷:利用
table.GetRowCount()和table.GetColumnCount()確定表格維度,并通過table.GetText(i, j)抓取每一個單元格的文本內容。 - 數(shù)據(jù)導出:將提取的數(shù)據(jù)填入
Workbook單元格,并根據(jù)需要保存為 CSV 或其他 Excel 支持的格式。
這種逐單元格處理的方式提供了極高的靈活性,例如你可以在寫入數(shù)據(jù)前對特定文本進行過濾、清洗或重新格式化。
實際應用
PDF 內容提取功能在實際工作中有廣泛的應用場景:
批量提取文檔內容
當需要處理大量 PDF 文件時,可以編寫批處理函數(shù)來自動化提取過程。以下是一個實用的批量提取示例:
from spire.pdf.common import *
from spire.pdf import *
import os
def ExtractContentFromPdfFolder(input_folder: str, output_folder: str):
"""從文件夾中的所有 PDF 文件提取文本和圖片"""
# 如果輸出文件夾不存在則創(chuàng)建
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍歷輸入文件夾中的所有文件
for filename in os.listdir(input_folder):
if filename.endswith(".pdf"):
# 構建完整的文件路徑
input_path = os.path.join(input_folder, filename)
base_name = os.path.splitext(filename)[0]
# 創(chuàng)建子文件夾存放提取的內容
content_folder = os.path.join(output_folder, base_name)
if not os.path.exists(content_folder):
os.makedirs(content_folder)
# 加載 PDF 文檔
doc = PdfDocument()
doc.LoadFromFile(input_path)
# 提取文本和圖片
all_text = []
image_count = 0
for i in range(doc.Pages.Count):
page = doc.Pages.get_Item(i)
# 提取文本
textExtractor = PdfTextExtractor(page)
options = PdfTextExtractOptions()
text = textExtractor.ExtractText(options)
all_text.append(f"--- 第 {i+1} 頁 ---\n{text}")
# 提取圖片
imageHelper = PdfImageHelper()
imageInfo = imageHelper.GetImagesInfo(page)
for info in imageInfo:
image_count += 1
img_path = os.path.join(content_folder, f"Image-{image_count}.png")
info.Image.Save(img_path)
# 保存文本
text_file = os.path.join(content_folder, "extracted_text.txt")
with open(text_file, "w", encoding="utf-8") as fp:
for t in all_text:
fp.write(t + "\n\n")
doc.Close()
print(f"已處理: {filename} (提取了 {image_count} 張圖片)")
# 使用示例
input_folder = "./PDF文檔"
output_folder = "./提取內容"
ExtractContentFromPdfFolder(input_folder, output_folder)
數(shù)據(jù)錄入自動化
從 PDF 表單或報告中提取特定區(qū)域的文本,自動填充到數(shù)據(jù)庫或電子表格中,減少人工錄入的工作量和錯誤率。
素材庫建設
設計師可以從大量的 PDF 宣傳材料中提取圖片資源,建立可重用的素材庫,提高設計效率。
文檔數(shù)字化
將紙質文檔掃描成的 PDF 進行內容提取,轉換為可搜索、可編輯的數(shù)字格式,便于長期保存和檢索。
實用技巧
在進行 PDF 內容提取時,以下技巧可以幫助獲得更好的結果:
- 坐標定位:提取特定區(qū)域文本時,可以使用 PDF 閱讀器查看頁面屬性來確定準確的坐標值
- 編碼處理:保存提取的文本時務必使用 UTF-8 編碼,以正確處理中文等特殊字符
- 圖片格式:根據(jù)實際需求選擇合適的圖片輸出格式(PNG 適合圖形,JPG 適合照片)
- 分頁處理:對于多頁文檔,建議在提取的文本中加入頁碼標記,便于后續(xù)定位
- 異常處理:某些 PDF 可能包含加密或損壞的內容,應添加適當?shù)腻e誤處理機制
總結
通過本文的介紹,我們學習了使用 Python 和 Spire.PDF 庫提取 PDF 內容的多種方法:
- 使用
PdfTextExtractor提取整頁或特定區(qū)域的文本 - 通過
ImagesInfo或PdfImageHelper提取頁面中的圖片 - 利用 PDF 到 Excel 的轉換功能間接提取表格數(shù)據(jù)
- 實現(xiàn)批量提取功能處理多個文檔
這些技術為 PDF 文檔的內容再利用提供了強大的工具。掌握這些技能后,您將能夠高效地從 PDF 文件中提取所需的信息,將靜態(tài)文檔轉換為有價值的數(shù)據(jù)資源,顯著提升工作效率和數(shù)據(jù)處理的靈活性。
以上就是Python實現(xiàn)一鍵提取PDF文件中的文本、表格和圖片的詳細內容,更多關于Python提取PDF的資料請關注腳本之家其它相關文章!
相關文章
pandas數(shù)據(jù)類型之Series的具體使用
本文主要介紹了pandas數(shù)據(jù)類型之Series的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08
Python實現(xiàn)數(shù)據(jù)庫表的監(jiān)控警告的項目實踐
本文主要介紹了使用Python 實現(xiàn)對數(shù)據(jù)庫表的監(jiān)控告警功能, 并將告警信息通過釘釘機器人發(fā)送到釘釘群,具有一定的參考價值,感興趣的可以了解一下2024-05-05

