Python實(shí)現(xiàn)PDF表格轉(zhuǎn)CSV的完整方法與代碼解析
PDF 格式因其版式固定性而廣泛用于文檔交換,但也導(dǎo)致結(jié)構(gòu)化數(shù)據(jù)(如表格)難以直接抽取。盡管存在多種解析方案(如基于文本坐標(biāo)啟發(fā)式或 OCR),但對于具有明確邊框和單元格邊界的表格,專用表格提取器能提供更高的準(zhǔn)確度。本文將介紹如何使用免費(fèi)庫 Free Spire.PDF for Python 解析 PDF 表格,并結(jié)合 Python 內(nèi)置 csv 標(biāo)準(zhǔn)庫完成數(shù)據(jù)導(dǎo)出。
一、環(huán)境準(zhǔn)備
1. 依賴庫安裝
本次實(shí)現(xiàn)依賴 PDF 解析組件與 Python 原生庫,執(zhí)行以下命令安裝免費(fèi)版 PDF 解析組件:
pip install Spire.Pdf.Free
2. 技術(shù)說明
- 核心依賴:
spire.pdf.free負(fù)責(zé)識別、提取 PDF 中的表格結(jié)構(gòu)與單元格數(shù)據(jù); - 文件導(dǎo)出:使用 Python 內(nèi)置
csv、os標(biāo)準(zhǔn)庫完成目錄創(chuàng)建、CSV 寫入,無需額外第三方數(shù)據(jù)處理庫; - 適用場景:支持單頁/多頁 PDF、單頁多表格場景,可自動按頁面+表格序號拆分輸出文件;
- 兼容性:導(dǎo)出 UTF-8 編碼 CSV,可直接用 Excel、WPS、Pandas 等工具讀取。
二、核心實(shí)現(xiàn)思路
- 初始化 PDF 文檔對象,加載本地 PDF 文件;
- 創(chuàng)建表格提取器,綁定已加載的 PDF 文檔;
- 遍歷 PDF 所有頁面,逐頁提取當(dāng)前頁面內(nèi)的全部表格;
- 針對每個表格,逐行、逐列讀取單元格文本,并做基礎(chǔ)文本清洗;
- 自動創(chuàng)建輸出目錄,將單張表格數(shù)據(jù)寫入獨(dú)立 CSV 文件,文件按頁面、表格編號命名;
- 執(zhí)行資源釋放操作,釋放 PDF 文檔占用的內(nèi)存與文件流。
三、完整代碼實(shí)現(xiàn)
該示例完整還原逐頁、逐表提取邏輯,自動創(chuàng)建輸出目錄,每個表格單獨(dú)生成 CSV 文件,附帶文本清洗邏輯:
from spire.pdf import PdfDocument, PdfTableExtractor
import csv
import os
# 初始化PDF文檔對象并加載文件
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")
# 創(chuàng)建PDF表格提取器
extractor = PdfTableExtractor(pdf)
# 定義輸出目錄,目錄不存在則自動創(chuàng)建
output_root = "Tables"
os.makedirs(output_root, exist_ok=True)
# 遍歷PDF每一頁
for page_index in range(pdf.Pages.Count):
# 提取當(dāng)前頁面下所有表格
tables = extractor.ExtractTable(page_index)
# 遍歷當(dāng)前頁面中的每一個表格
for table_index, table in enumerate(tables):
table_data = []
# 讀取表格所有行
row_total = table.GetRowCount()
for row in range(row_total):
row_data = []
# 讀取當(dāng)前行所有列
col_total = table.GetColumnCount()
for col in range(col_total):
# 提取單元格文本,去除換行符、首尾空白字符
cell_text = table.GetText(row, col).replace("\n", "").strip()
row_data.append(cell_text)
table_data.append(row_data)
# 拼接CSV文件路徑,按 頁面-表格 編號命名
csv_name = f"Page{page_index + 1}-Table{table_index + 1}.csv"
csv_path = os.path.join(output_root, csv_name)
# 寫入CSV文件,指定UTF-8編碼,newline避免多余空行
with open(csv_path, "w", newline="", encoding="utf-8") as csvfile:
writer = csv.writer(csvfile)
writer.writerows(table_data)
print(f"已導(dǎo)出:{csv_path}")
# 釋放PDF文檔資源
pdf.Dispose()
print("所有表格導(dǎo)出完成")
四、代碼解析
4.1 核心類說明
PdfDocument:PDF 文檔操作主類,LoadFromFile()用于加載本地 PDF 文件,Pages.Count獲取文檔總頁數(shù),Dispose()用于釋放文件流、內(nèi)存等資源,批量處理文件時必須調(diào)用,防止內(nèi)存堆積。PdfTableExtractor:專用表格提取器,依賴已加載的PdfDocument對象初始化;ExtractTable(page_index)接收頁碼索引,返回當(dāng)前頁面內(nèi)所有表格對象集合。
4.2 表格數(shù)據(jù)讀取方法
GetRowCount():獲取當(dāng)前表格的總行數(shù);GetColumnCount():獲取當(dāng)前行的總列數(shù);GetText(row, col):根據(jù)行、列索引讀取單元格原始文本。
4.3 文本清洗邏輯
replace("\n", "").strip() 是實(shí)用的預(yù)處理邏輯:
- 去除單元格內(nèi)的換行符,避免 CSV 格式錯亂;
- 清除文本首尾空格、制表符,保證數(shù)據(jù)整潔。
4.4 CSV 寫入關(guān)鍵配置
encoding="utf-8":統(tǒng)一使用 UTF-8 編碼,從根源避免中文亂碼;newline="":Pythoncsv庫專屬配置,禁止自動插入空行,保證 CSV 格式標(biāo)準(zhǔn);os.makedirs(..., exist_ok=True):自動創(chuàng)建多級目錄,exist_ok=True表示目錄已存在時不拋出異常。
4.5 文件命名規(guī)則
文件采用 Page頁碼-Table表格序號.csv 命名,可直觀區(qū)分?jǐn)?shù)據(jù)來源,方便后續(xù)文件管理與溯源。
五、拓展應(yīng)用方向
批量處理多文件:結(jié)合 os.listdir() 遍歷指定文件夾,批量讀取目錄下所有 PDF,循環(huán)調(diào)用封裝函數(shù)實(shí)現(xiàn)全量表格導(dǎo)出。
數(shù)據(jù)二次加工:導(dǎo)出 CSV 后結(jié)合 pandas 庫,實(shí)現(xiàn)數(shù)據(jù)篩選、去重、統(tǒng)計(jì)、格式轉(zhuǎn)換等數(shù)據(jù)分析操作。
表頭單獨(dú)處理:識別表格第一行為表頭,寫入 CSV 時單獨(dú)指定表頭行,提升數(shù)據(jù)可讀性。
過濾空表格:在代碼中增加數(shù)據(jù)判空邏輯,跳過無有效內(nèi)容的空白表格,減少無效文件生成。
六、知識擴(kuò)展
要將PDF表格完美地轉(zhuǎn)換成CSV,關(guān)鍵是找到匹配的解析方法。目前,camelot-py、tabula-py和pdfplumber是解決這類需求最核心的三個Python庫,它們各有側(cè)重,也各有適用的場景。
根據(jù)你的PDF文件類型,選擇最適合的代碼并運(yùn)行即可。
1. camelot-py:最適合有邊框的表格
這種方法對有明確線條的表格提取效果最好,安裝簡單,但依賴于OpenCV:
pip install camelot-py[cv]
下面的代碼演示了最簡潔的用法,只需幾行就能提取表格并導(dǎo)出為CSV。
import camelot
# 讀取PDF并提取表格,flavor='lattice'適用于有邊框的表格
# 可以指定pages='all'來提取所有頁面
tables = camelot.read_pdf('your_table.pdf', pages='1-3', flavor='lattice')
# 將所有提取的表格導(dǎo)出為多個CSV文件(或一個ZIP壓縮包)
tables.export('output.csv', f='csv', compress=False)
# 查看第一個提取的表格
print(tables[0].df)
# 如果只想保存第一個表格
# tables[0].to_csv('single_table.csv')2. pdfplumber:更通用和靈活
pdfplumber 在靈活性和易用性之間取得了很好的平衡,處理各種風(fēng)格的表格。
pip install pdfplumber
對于大多數(shù)情況,extract_table() 方法已經(jīng)足夠好用。但如果遇到樣式復(fù)雜的表格,extract_tables() 配合 table_settings 參數(shù)能幫你更好地控制提取邏輯。
import csv
import pdfplumber
with pdfplumber.open("your_table.pdf") as pdf:
# 假設(shè)表格在第一頁
page = pdf.pages[0]
# 智能提取表格(自動檢測)
# 如果效果不佳,可以嘗試指定table_settings參數(shù)
# table_settings = {"vertical_strategy": "lines", "horizontal_strategy": "lines"}
# table = page.extract_table(table_settings=table_settings)
table = page.extract_table()
if table:
with open("output.csv", "w", newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(table)pdfplumber 也支持一次性提取頁面中的所有表格。
with pdfplumber.open("your_table.pdf") as pdf:
page = pdf.pages[0]
tables = page.extract_tables()
for i, table in enumerate(tables):
if table:
with open(f"table_{i+1}.csv", "w", newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(table)3. tabula-py:快速且功能全面
tabula-py 是Java版Tabula的Python封裝。使用前需安裝Java 8+環(huán)境并將其添加到系統(tǒng)PATH環(huán)境變量中。
pip install tabula-py
它的API設(shè)計(jì)非常直接,一行命令就能完成PDF到CSV的轉(zhuǎn)換,對新手很友好。
import tabula
# 提取PDF中所有表格,并保存為CSV文件
tabula.convert_into("your_table.pdf", "output.csv", output_format="csv", pages='all')
# 提取表格到DataFrame列表,以便進(jìn)行數(shù)據(jù)處理
# df_list = tabula.read_pdf("your_table.pdf", pages='all')
# print(df_list[0]) # 打印第一個表格七、總結(jié)
以上 Python 示例演示了如何輕松實(shí)現(xiàn) PDF 表格提取并導(dǎo)出為 CSV 文件。通過逐頁掃描、單元格清理和標(biāo)準(zhǔn) CSV 寫入,可構(gòu)建穩(wěn)定可靠的數(shù)據(jù)抽取流程。在實(shí)際集成中,開發(fā)者應(yīng)當(dāng)關(guān)注表格邊框依賴、頁面限制以及資源釋放等關(guān)鍵因素,并根據(jù)文檔特性調(diào)整文本清洗規(guī)則。該方法不依賴任何中間格式或額外解析庫,代碼結(jié)構(gòu)清晰,適用于自動化數(shù)據(jù)處理管道。
以上就是Python實(shí)現(xiàn)PDF表格轉(zhuǎn)CSV的完整方法與代碼解析的詳細(xì)內(nèi)容,更多關(guān)于Python PDF表格轉(zhuǎn)CSV的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html
這篇文章主要介紹了python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html,由于需要對ocr識別系統(tǒng)的表格識別結(jié)果做驗(yàn)證,通過返回的json文件結(jié)果對比比較麻煩,故需要將json文件里面的識別結(jié)果還原為表格做驗(yàn)證,下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-03-03
python Selenium實(shí)現(xiàn)付費(fèi)音樂批量下載的實(shí)現(xiàn)方法
這篇文章主要介紹了python Selenium實(shí)現(xiàn)付費(fèi)音樂批量下載的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
Python之重導(dǎo)出機(jī)制的實(shí)現(xiàn)示例
重導(dǎo)出不是Python的保留關(guān)鍵字,也不是新的語法結(jié)構(gòu),而是一種利用?import?語義實(shí)現(xiàn)的設(shè)計(jì)模式,下面就來詳細(xì)的介紹一下Python之重導(dǎo)出機(jī)制的實(shí)現(xiàn)示例,感興趣的可以了解一下2026-05-05
pandas DataFrame where的實(shí)現(xiàn)示例
pandas.DataFrame.where方法提供了一種靈活的方式來根據(jù)條件篩選和替換DataFrame中的元素,本文主要介紹了pandas DataFrame where的實(shí)現(xiàn)示例,感興趣的可以了解一下2025-04-04
python3.6使用tkinter實(shí)現(xiàn)彈跳小球游戲
這篇文章主要為大家詳細(xì)介紹了python3.6使用tkinter實(shí)現(xiàn)彈跳小球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05

