You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python提取指定格式PDF文本并按要求导出为CSV文件

问题根源

PyPDF2 自带的extractText()仅按PDF内容流的绘制顺序提取字符,完全不解析表格边框、文本坐标位置、列边界这些布局信息,多列表格的内容会被直接按顺序拼成连续纯文本。你之前的代码是把整页提取到的单块文本直接写入Excel单个单元格,自然只能得到单列的错乱结果,根本没有做结构化拆分。

可落地方案

针对带明确边框线的表格类PDF,直接用专门做PDF表格识别的Camelot库即可,不需要手动写坐标判断逻辑,识别准确率远高于原生PyPDF2。

前置依赖安装

  1. 先安装底层依赖Ghostscript:
    • Windows:下载官方安装包,安装后把程序路径加入系统环境变量
    • Mac:执行brew install ghostscript
    • Linux:执行sudo apt install ghostscript
  2. 安装Python依赖包:
    pip install "camelot-py[cv]" pandas
    

实现代码

import camelot
import pandas as pd

# 读取PDF中所有页面的带边框表格
# lattice模式专门适配有可见分隔线的表格场景,匹配常规表单类PDF格式
tables = camelot.read_pdf(
    filepath="sample.pdf",
    pages="1-end",  # 传入页码范围,全本提取就写1-end
    flavor="lattice",
    line_scale=40
)

# 合并所有提取到的表格数据
df_list = []
for table in tables:
    # 打印提取报告,可查看当前表格的识别准确率
    print(table.parsing_report)
    temp_df = table.df
    # 将第一行识别为表头,可根据自己的PDF实际结构调整
    temp_df.columns = temp_df.iloc[0]
    temp_df = temp_df.drop(index=0).reset_index(drop=True)
    df_list.append(temp_df)

# 导出为符合要求的结构化CSV
final_data = pd.concat(df_list, ignore_index=True)
final_data.to_csv("structured_result.csv", index=False, encoding="utf-8-sig")
print("结构化文件导出完成")

无框线表格适配

如果后续遇到没有明确边框线的表格,把读取参数里的flavor改成stream即可,这个模式会根据文本块之间的空白间距判断列边界:

tables = camelot.read_pdf(
    filepath="sample.pdf",
    pages="1-end",
    flavor="stream",
    edge_tol=500
)
参数调整提示

如果识别出现列拆分错误,微调对应模式的参数即可:

  • lattice模式下调整line_scale值,数值越大对越细的表格线识别越好
  • stream模式下调整edge_tol值,数值越大越容易把距离较远的文本判定为同一行

内容的提问来源于stack exchange,提问作者kkk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:27:32