博客 / 詳情

返回

Python 將 PDF 表格數據提取至 TXT 或 Excel

在數據處理與辦公自動化場景中,PDF 表格因格式穩定被廣泛使用,但不可直接編輯的特性,給數據統計、分析和二次加工帶來諸多不便。手動複製粘貼不僅效率低下,還容易出現數據錯位、遺漏等問題。

本文將分享一種高效的解決方案—基於Python結合Spire系列庫,實現 PDF 表格數據的精準提取,並分別導出為 TXT 文本和 Excel 表格格式。該方案無需複雜的正則表達式或OCR識別,代碼簡潔易上手,適合批量處理各類PDF表格文件。

一、準備工作:安裝所需 Python 庫

本次實戰需要兩個核心庫,分別負責 PDF 表格提取和 Excel 文件生成,功能分工明確:

  • Spire.PDF for Python:一款輕量級 PDF 處理庫,支持直接識別 PDF 中的表格結構,精準提取單元格數據,無需依賴額外的 OCR 工具。
  • Spire.XLS for Python:專業的 Excel 操作庫,可實現 Excel 文件的創建、數據寫入、格式優化等功能,完美適配各類 Excel 版本。

打開命令行終端,執行以下pip命令完成安裝(建議在虛擬環境中操作,避免版本衝突):

pip install Spire.PDF
pip install Spire.XLS

二、實戰1:提取 PDF 表格數據到 TXT 文件

TXT 文件具有體積小、兼容性強的特點,適合快速查看和傳輸數據。使用 Spire.PDF for Python 提取數據並寫入 TXT 的核心邏輯,是按頁面→表格→行→列的層級遍歷 PDF 內容,最終將數據格式化輸出。

實現步驟拆解

  1. 加載 PDF 文檔:通過 PdfDocument 類的 LoadFromFile() 方法讀取目標 PDF 文件,支持相對路徑和絕對路徑。
  2. 初始化提取工具:創建 PdfTableExtractor 對象,用於識別並提取 PDF 頁面中的表格數據。
  3. 層級遍歷數據:依次遍歷 PDF 的每一頁、每頁中的每個表格、表格的每一行和每一列,通過 GetText(rowIndex, columnIndex) 方法獲取單元格文本。
  4. 寫入 TXT 文件:將提取的數據按“列用空格分隔、行用換行分隔”的格式整理,寫入TXT文件並指定 UTF-8 編碼,避免中文亂碼。

完整代碼示例(含詳細註釋)

from spire.pdf.common import *
from spire.pdf import *

# 1. 加載PDF文檔,替換為你的目標PDF文件路徑
pdf_doc = PdfDocument()
pdf_doc.LoadFromFile("表格.pdf")

# 2. 創建列表存儲提取的數據,便於後續拼接
data_list = []

# 3. 初始化表格提取器
table_extractor = PdfTableExtractor(pdf_doc)

# 4. 遍歷PDF的每一頁
for page_idx in range(pdf_doc.Pages.Count):
    # 提取當前頁面的所有表格
    tables = table_extractor.ExtractTable(page_idx)
    # 判斷當前頁面是否存在表格,避免空指針異常
    if tables is not None and len(tables) > 0:
        # 遍歷每個表格
        for table in tables:
            row_num = table.GetRowCount()  # 獲取表格總行數
            col_num = table.GetColumnCount()  # 獲取表格總列數
            # 遍歷表格的每一行
            for i in range(row_num):
                row_data = []
                # 遍歷該行的每一列
                for j in range(col_num):
                    # 獲取單元格文本
                    cell_text = table.GetText(i, j)
                    row_data.append(cell_text)
                # 用空格分隔列數據,拼接成一行
                data_list.append(" ".join(row_data))
            # 不同表格之間添加空行,區分數據邊界
            data_list.append("")

# 5. 將數據寫入TXT文件
with open("提取PDF表格.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(data_list))

# 6. 釋放資源,避免內存佔用
pdf_doc.Close()

三、實戰2:提取 PDF 表格數據到 Excel 文件

Excel 文件支持數據篩選、公式計算、圖表生成等高級功能,是數據分析的首選格式。本示例需要結合 Spire.PDF for PythonSpire.XLS for Python,在提取數據的基礎上,實現 Excel 文件的創建和數據寫入。

實現步驟拆解

數據提取的步驟與 TXT 示例一致,額外增加 Excel 文件操作的3個核心步驟:

  1. 創建Excel工作簿:實例化 Workbook 對象,清空默認工作表,為後續添加新表格做準備。
  2. 數據寫入單元格:Excel 的行列索引從1開始(與Python的0索引不同),因此需要將表格的行、列索引分別+1,確保數據寫入正確位置。
  3. 優化表格格式:調用 AutoFitColumns() 方法設置列寬自適應內容,提升表格可讀性,最後保存為指定版本的Excel文件。

完整代碼示例(含詳細註釋)

from spire.pdf import *
from spire.xls import *

# 1. 加載PDF文檔
pdf_doc = PdfDocument()
pdf_doc.LoadFromFile("表格.pdf")

# 2. 創建Excel工作簿並清空默認工作表
excel_workbook = Workbook()
excel_workbook.Worksheets.Clear()

# 3. 初始化表格提取器
table_extractor = PdfTableExtractor(pdf_doc)

# 4. 工作表編號,用於命名新工作表
sheet_index = 1

# 5. 遍歷PDF的每一頁
for page_idx in range(pdf_doc.Pages.Count):
    tables = table_extractor.ExtractTable(page_idx)
    if tables is not None and len(tables) > 0:
        # 遍歷當前頁面的每個表格
        for table in tables:
            # 創建新工作表,命名為“sheet+編號”
            worksheet = excel_workbook.Worksheets.Add(f"sheet{sheet_index}")
            row_num = table.GetRowCount()
            col_num = table.GetColumnCount()
            # 遍歷表格單元格
            for i in range(row_num):
                for j in range(col_num):
                    cell_text = table.GetText(i, j)
                    # Excel索引從1開始,需將i和j分別+1
                    worksheet.Range[i + 1, j + 1].Value = cell_text
            # 設置列寬自適應內容,優化顯示效果
            worksheet.AllocatedRange.AutoFitColumns()
            # 工作表編號遞增
            sheet_index += 1

# 6. 保存Excel文件,指定保存路徑和Excel版本
excel_workbook.SaveToFile("導出PDF表格到Excel.xlsx", ExcelVersion.Version2016)

# 7. 釋放資源
pdf_doc.Close()
excel_workbook.Dispose()

四、關鍵注意事項

  1. 文件路徑問題:若運行代碼時提示“文件不存在”,請檢查 PDF 文件路徑是否正確,建議使用絕對路徑(如 C:/data/表格.pdf)避免路徑錯誤。
  2. 中文亂碼處理:寫入 TXT 文件時,務必指定 encoding="utf-8";導出 Excel 文件時,Spire.XLS for Python 默認支持中文,無需額外配置。
  3. 資源釋放:使用 Close()Dispose() 方法釋放 PDF 和 Excel 對象,避免長時間運行導致內存泄漏。

五、總結

基於Spire系列庫,能夠快速實現 PDF 表格數據的提取與格式轉換,相比傳統的手動操作,效率提升數十倍。該方案適用於各類場景,如批量提取財務報表、科研數據、政務文件中的 PDF 表格,為數據自動化處理提供了可靠的技術支撐。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.