使用 Python 快速提取 PDF 中的表格

在数据分析工作中,我们经常遇到需要从 PDF 文件中提取表格数据的场景。然而,直接复制 PDF 中的表格往往会导致格式混乱、数据错位。本文将手把手教你使用 Spire.PDF for Python 库,快速准确地识别并提取 PDF 中的表格,并将数据保存为 CSV、Excel 等常用格式。

一、准备工作:安装必要的库

首先需要安装 Spire.PDF 库。打开终端或命令行,执行以下命令:

复制代码
pip install Spire.PDF

如果你计划将提取的数据导出为 Excel 格式,建议同时安装 pandas 和 openpyxl:

复制代码
pip install pandas openpyxl

二、核心代码:提取 PDF 中的表格

下面的代码演示了如何从 PDF 的第一页提取表格,并逐行打印单元格内容:

复制代码
from spire.pdf import PdfDocument, PdfTableExtractor

# 1. 加载 PDF 文件
pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")

# 2. 创建表格提取器
table_extractor = PdfTableExtractor(pdf)

# 3. 提取第一页的所有表格
tables = table_extractor.ExtractTable(0)

# 4. 遍历每个表格
for table in tables:
    row_count = table.GetRowCount()
    column_count = table.GetColumnCount()

    # 逐行提取单元格内容
    for i in range(row_count):
        row_data = []
        for j in range(column_count):
            cell_text = table.GetText(i, j)
            row_data.append(cell_text)
        print(row_data)

代码说明

方法 作用
LoadFromFile() 加载指定路径的 PDF 文件
PdfTableExtractor() 创建表格提取器实例
ExtractTable(页码) 提取指定页面的所有表格,页码从 0 开始
GetRowCount() / GetColumnCount() 获取表格的行数和列数
GetText(行, 列) 获取指定单元格的文本内容

三、进阶处理:多页 PDF 批量提取

如果 PDF 包含多个页面,可以使用循环批量提取所有表格:

复制代码
from spire.pdf import PdfDocument, PdfTableExtractor

pdf = PdfDocument()
pdf.LoadFromFile("multi_page_report.pdf")

# 遍历所有页面
for page_index in range(pdf.Pages.Count):
    extractor = PdfTableExtractor(pdf)
    tables = extractor.ExtractTable(page_index)

    print(f"\n=== 第 {page_index + 1} 页 共找到 {len(tables)} 个表格 ===")

    for t, table in enumerate(tables):
        print(f"--- 表格 {t+1} ---")
        rows = table.GetRowCount()
        cols = table.GetColumnCount()

        for i in range(rows):
            row = [table.GetText(i, j) for j in range(cols)]
            print(row)

四、导出数据:保存为 CSV 或 Excel 文件

提取的表格数据可以方便地转换为其他格式。以下示例将数据保存为 CSV 文件:

复制代码
import csv
from spire.pdf import PdfDocument, PdfTableExtractor

pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")

extractor = PdfTableExtractor(pdf)
tables = extractor.ExtractTable(0)

if tables:
    table = tables[0]
    rows = table.GetRowCount()
    cols = table.GetColumnCount()

    # 收集所有数据
    data = []
    for i in range(rows):
        row_data = [table.GetText(i, j) for j in range(cols)]
        data.append(row_data)

    # 写入 CSV 文件
    with open("output.csv", "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerows(data)

    print(f"成功导出 {rows} 行 × {cols} 列 数据到 output.csv")

若想导出为 Excel 文件,可借助 pandas:

复制代码
import pandas as pd

# 假设 data 是上面提取的二维列表
df = pd.DataFrame(data[1:], columns=data[0])  # 首行作为列标题
df.to_excel("output.xlsx", index=False)
print("数据已保存为 output.xlsx")

五、常见问题与技巧

  1. 表格识别不完整? 检查 PDF 中的表格是否有清晰的边框,扫描件或图片型 PDF 需要使用 OCR 技术,Spire.PDF 主要适用于文本型 PDF。
  2. 合并单元格处理 :Spire.PDF 会自动处理合并单元格,GetText() 会返回合并区域左上角单元格的内容,其他位置返回空字符串。
  3. 性能优化 :处理大型 PDF 时,建议逐页提取并即时保存,避免一次性加载全部表格到内存。

通过以上步骤,你已经掌握了使用 Python 提取 PDF 表格的完整流程。这个方案可以轻松集成到自动化数据处理流水线中,大幅提升工作效率。

相关推荐
无情的西瓜皮1 小时前
MCP协议实战:用Python从零搭建一个AI Agent工具服务器(保姆级教程)
服务器·人工智能·python·mcp
岁月宁静2 小时前
驾驭 AI 这匹野马:深入解析智能体 Harness 工程
vue.js·python
星恒随风3 小时前
Python 基础语法详解(一):从表达式、变量到数据类型
开发语言·笔记·python·学习
888CC++3 小时前
java 并发编程
java·开发语言·python
Dxy12393102163 小时前
python缩放图片如何保证图片质量
python
ZHW_AI课题组4 小时前
腾讯云调用IP定位
人工智能·python·机器学习
zhaoshuzhaoshu4 小时前
Python文件操作详细解析带例子
python
醒醒该学习了!4 小时前
Anaconda安装教程+第一个python例子
开发语言·python
南风微微吹4 小时前
2026英语六级作文模版万能句子PDF电子版
pdf·英语六级