PDF 表格转 CSV:Python 实现方法与代码解析

一、环境准备

1. 依赖库安装

本次实现依赖 PDF 解析组件与 Python 原生库,执行以下命令安装免费版 PDF 解析组件:

复制代码
pip install Spire.Pdf.Free

2. 技术说明

  • 核心依赖:spire.pdf.free 负责识别、提取 PDF 中的表格结构与单元格数据;
  • 文件导出:使用 Python 内置 csv、os 标准库完成目录创建、CSV 写入,无需额外第三方数据处理库;
  • 适用场景:支持单页/多页 PDF、单页多表格场景,可自动按页面+表格序号拆分输出文件;
  • 兼容性:导出 UTF-8 编码 CSV,可直接用 Excel、WPS、Pandas 等工具读取。

二、核心实现思路

  1. 初始化 PDF 文档对象,加载本地 PDF 文件;
  2. 创建表格提取器,绑定已加载的 PDF 文档;
  3. 遍历 PDF 所有页面,逐页提取当前页面内的全部表格;
  4. 针对每个表格,逐行、逐列读取单元格文本,并做基础文本清洗;
  5. 自动创建输出目录,将单张表格数据写入独立 CSV 文件,文件按页面、表格编号命名;
  6. 执行资源释放操作,释放 PDF 文档占用的内存与文件流。

三、完整代码实现

该示例完整还原逐页、逐表提取逻辑,自动创建输出目录,每个表格单独生成 CSV 文件,附带文本清洗逻辑:

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

# 初始化PDF文档对象并加载文件
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")

# 创建PDF表格提取器
extractor = PdfTableExtractor(pdf)

# 定义输出目录,目录不存在则自动创建
output_root = "Tables"
os.makedirs(output_root, exist_ok=True)

# 遍历PDF每一页
for page_index in range(pdf.Pages.Count):
    # 提取当前页面下所有表格
    tables = extractor.ExtractTable(page_index)
    
    # 遍历当前页面中的每一个表格
    for table_index, table in enumerate(tables):
        table_data = []
        
        # 读取表格所有行
        row_total = table.GetRowCount()
        for row in range(row_total):
            row_data = []
            # 读取当前行所有列
            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"已导出:{csv_path}")

# 释放PDF文档资源
pdf.Dispose()
print("所有表格导出完成")

四、代码解析

4.1 核心类说明

  1. PdfDocument

    PDF 文档操作主类,LoadFromFile() 用于加载本地 PDF 文件,Pages.Count 获取文档总页数,Dispose() 用于释放文件流、内存等资源,批量处理文件时必须调用,防止内存堆积。

  2. PdfTableExtractor

    专用表格提取器,依赖已加载的 PdfDocument 对象初始化;ExtractTable(page_index) 接收页码索引,返回当前页面内所有表格对象集合。

4.2 表格数据读取方法

  • GetRowCount():获取当前表格的总行数;
  • GetColumnCount():获取当前行的总列数;
  • GetText(row, col):根据行、列索引读取单元格原始文本。

4.3 文本清洗逻辑

replace("\n", "").strip() 是实用的预处理逻辑:

  • 去除单元格内的换行符,避免 CSV 格式错乱;
  • 清除文本首尾空格、制表符,保证数据整洁。

4.4 CSV 写入关键配置

  • encoding="utf-8":统一使用 UTF-8 编码,从根源避免中文乱码;
  • newline="":Python csv 库专属配置,禁止自动插入空行,保证 CSV 格式标准;
  • os.makedirs(..., exist_ok=True):自动创建多级目录,exist_ok=True 表示目录已存在时不抛出异常。

4.5 文件命名规则

文件采用 Page页码-Table表格序号.csv 命名,可直观区分数据来源,方便后续文件管理与溯源。


五、拓展应用方向

  1. 批量处理多文件

    结合 os.listdir() 遍历指定文件夹,批量读取目录下所有 PDF,循环调用封装函数实现全量表格导出。

  2. 数据二次加工

    导出 CSV 后结合 pandas 库,实现数据筛选、去重、统计、格式转换等数据分析操作。

  3. 表头单独处理

    识别表格第一行为表头,写入 CSV 时单独指定表头行,提升数据可读性。

  4. 过滤空表格

    在代码中增加数据判空逻辑,跳过无有效内容的空白表格,减少无效文件生成。

相关推荐
LOVE️YOU3 分钟前
Python 在定义函数时,究竟定义的是什么?
python
段一凡-华北理工大学16 分钟前
大模型应用开发 100 天:Python + LLM 从入门到精通 day26~Prompt 调试与优化——A/B 测试与效果评估
windows·python·大模型·prompt·智能体·提示词工程·高炉智能化
Minecraft红客17 分钟前
以撒的结合
python·游戏·电脑·娱乐
Circ.28 分钟前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
风早爽太1 小时前
用 ‌Render‌ 快速部署网站和常见问题解决
python·fastapi
现任明教教主~2 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
李航19832 小时前
给自己的图形引擎,配上了AI渲染,做设计真是太方便了
人工智能·python·计算机视觉·ai·ai编程
L@ncor2 小时前
第六章 框架开发实践 · 学习笔记(AutoGen / AgentScope / CAMEL / LangGraph)
python·框架·autogen·langgraph·agentscope
Zhou1411362 小时前
SpringSecurity_02_授权与高级功能
开发语言·python
码匠许师傅3 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http