Python實(shí)現(xiàn)高效提取PDF中的表格數(shù)據(jù)并導(dǎo)出為 TXT或Excel
在日常辦公、數(shù)據(jù)分析或信息歸檔過程中,我們經(jīng)常會遇到包含表格數(shù)據(jù)的 PDF 文件。然而,PDF 本質(zhì)上是一種用于展示和打印的格式,并非為數(shù)據(jù)處理而設(shè)計(jì),因此直接從中提取結(jié)構(gòu)化數(shù)據(jù)頗具挑戰(zhàn)。幸運(yùn)的是,借助 Python 強(qiáng)大的生態(tài)工具,我們可以自動化地從 PDF 中識別并提取表格內(nèi)容,并將其保存為便于后續(xù)處理的 TXT 或 Excel(.xlsx)格式。
本文將介紹兩種主流且高效的開源庫——Tabula-py 和 Camelot-py,并通過完整示例演示如何將 PDF 表格數(shù)據(jù)導(dǎo)出為 TXT 和 Excel 文件。
一、準(zhǔn)備工作:安裝必要依賴
首先,確保你的系統(tǒng)已安裝 Java(Tabula 依賴 Java 運(yùn)行),然后通過 pip 安裝所需庫:
# 安裝 Tabula-py(基于 Java 的 Tabula 工具) pip install tabula-py pandas openpyxl # 或安裝 Camelot-py(基于 Ghostscript 和 OpenCV,更強(qiáng)大但配置稍復(fù)雜) pip install camelot-py[cv] pandas openpyxl
注意:使用 Camelot 時(shí),Windows 用戶需額外安裝 Ghostscript 并將其添加到系統(tǒng) PATH。
二、方法一:使用 Tabula-py(簡單快捷)
Tabula-py 是對 Java 工具 Tabula 的 Python 封裝,適合處理結(jié)構(gòu)清晰、邊界線完整的表格。
示例:提取 PDF 表格并保存為 Excel 和 TXT
import tabula
import pandas as pd
# 指定 PDF 文件路徑
pdf_path = "example_table.pdf"
# 提取所有頁面的表格(返回 DataFrame 列表)
tables = tabula.read_pdf(pdf_path, pages="all", multiple_tables=True)
# 合并所有表格(或按需處理單個(gè))
combined_df = pd.concat(tables, ignore_index=True)
# 導(dǎo)出為 Excel
combined_df.to_excel("output.xlsx", index=False)
# 導(dǎo)出為 TXT(以制表符分隔)
combined_df.to_csv("output.txt", sep="\t", index=False, na_rep="")
print("表格已成功導(dǎo)出為 Excel 和 TXT 文件!")
優(yōu)點(diǎn):
- 使用簡單,幾行代碼即可完成。
- 對標(biāo)準(zhǔn)表格(有邊框線)識別準(zhǔn)確率高。
局限:
- 對無邊框或布局復(fù)雜的表格支持較弱。
- 依賴 Java 環(huán)境。
三、方法二:使用 Camelot-py(精準(zhǔn)靈活)
Camelot 提供了兩種解析模式:lattice(適用于有邊框的表格)和 stream(適用于無邊框但對齊良好的表格),靈活性更高。
示例:使用 Camelot 提取并導(dǎo)出
import camelot
import pandas as pd
pdf_path = "example_table.pdf"
# 使用 'lattice' 模式(有邊框表格)
tables = camelot.read_pdf(pdf_path, pages="all", flavor="lattice")
# 若表格無邊框,可嘗試:
# tables = camelot.read_pdf(pdf_path, pages="all", flavor="stream")
if tables:
# 合并所有表格
dfs = [table.df for table in tables]
combined_df = pd.concat(dfs, ignore_index=True)
# 清理列名(Camelot 默認(rèn)無列名,第一行為數(shù)據(jù))
# 如需將第一行設(shè)為列名:
# combined_df.columns = combined_df.iloc[0]
# combined_df = combined_df[1:].reset_index(drop=True)
# 導(dǎo)出
combined_df.to_excel("camelot_output.xlsx", index=False)
combined_df.to_csv("camelot_output.txt", sep="\t", index=False, header=False)
print(f"成功提取 {len(tables)} 個(gè)表格,已保存為 Excel 和 TXT。")
else:
print("未檢測到任何表格。")
優(yōu)點(diǎn):
- 支持無邊框表格(stream 模式)。
- 可可視化調(diào)試表格區(qū)域(
tables[0].plot())。 - 提供精度評估指標(biāo)(如 accuracy)。
局限:
- 配置稍復(fù)雜,需安裝 Ghostscript。
- 大文件處理速度略慢于 Tabula。
四、導(dǎo)出格式說明
- Excel (.xlsx) :保留表格結(jié)構(gòu),支持多列、多行,適合后續(xù)分析(使用
pandas.DataFrame.to_excel)。 - TXT (.txt) :通常以制表符(
\t)或逗號分隔,輕量且兼容性強(qiáng)(使用to_csv并指定sep)。
提示:若需保留原始換行或特殊字符,可在 to_csv 中設(shè)置 quoting=csv.QUOTE_ALL 或調(diào)整編碼(如 encoding='utf-8-sig')。
五、常見問題與優(yōu)化建議
表格識別不全?
- 嘗試指定具體頁碼:
pages="1,3,5"。 - 調(diào)整 Camelot 的
table_areas參數(shù)手動劃定區(qū)域。
中文亂碼?
確保 PDF 使用標(biāo)準(zhǔn)字體;導(dǎo)出時(shí)指定 encoding='utf-8-sig'。
性能優(yōu)化
- 對于大批量 PDF,建議使用多進(jìn)程或異步處理。
- 預(yù)處理 PDF(如裁剪、增強(qiáng)對比度)可提升識別率。
結(jié)語
Python 為 PDF 表格數(shù)據(jù)提取提供了強(qiáng)大而靈活的解決方案。Tabula-py 適合快速上手的標(biāo)準(zhǔn)表格,而 Camelot-py 則在復(fù)雜場景下表現(xiàn)更優(yōu)。結(jié)合 pandas 的數(shù)據(jù)處理能力,我們可以輕松將“不可編輯”的 PDF 表格轉(zhuǎn)化為結(jié)構(gòu)化的 TXT 或 Excel 文件,大幅提升數(shù)據(jù)再利用效率。
無論你是財(cái)務(wù)人員、數(shù)據(jù)分析師還是自動化開發(fā)者,掌握這些工具都將顯著簡化你的工作流程??煸囋嚢?!
到此這篇關(guān)于Python實(shí)現(xiàn)高效提取PDF中的表格數(shù)據(jù)并導(dǎo)出為 TXT或Excel的文章就介紹到這了,更多相關(guān)Python提取PDF表格數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python提取PDF表格數(shù)據(jù)并導(dǎo)出為TXT、Excel?格式
- 使用Python將Word文檔導(dǎo)出為PDF格式并從Word文檔中提取數(shù)據(jù)
- Python利用pdfplumber提取PDF文檔中的表格數(shù)據(jù)并導(dǎo)出
- Python利用pdfplumber庫提取pdf中表格數(shù)據(jù)
- 如何利用Python提取pdf中的表格數(shù)據(jù)(附實(shí)戰(zhàn)案例)
- python用pdfplumber提取pdf表格數(shù)據(jù)并保存到excel文件中
- python?pdfplumber庫批量提取pdf表格數(shù)據(jù)轉(zhuǎn)換為excel
- python從PDF中提取數(shù)據(jù)的示例
- Python 用三行代碼提取PDF表格數(shù)據(jù)
相關(guān)文章
Pytorch中關(guān)于nn.Conv2d()參數(shù)的使用
這篇文章主要介紹了Pytorch中關(guān)于nn.Conv2d()參數(shù)的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
python中字符串類型json操作的注意事項(xiàng)
這篇文章主要給大家介紹了python中字符串類型json操作的一些注意事項(xiàng),文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05
Python tkinter庫實(shí)現(xiàn)登錄注冊基本功能
Python自帶了tkinter模塊,實(shí)質(zhì)上是一種流行的面向?qū)ο蟮腉UI工具包 TK 的Python編程接口,提供了快速便利地創(chuàng)建GUI應(yīng)用程序的方法,下面這篇文章主要給大家介紹了關(guān)于tkinter庫制作一個(gè)簡單的登錄注冊小程序,需要的朋友可以參考下2022-12-12

