如何使用Python提取指定格式PDF文本并按要求导出为CSV文件
问题根源
PyPDF2 自带的extractText()仅按PDF内容流的绘制顺序提取字符,完全不解析表格边框、文本坐标位置、列边界这些布局信息,多列表格的内容会被直接按顺序拼成连续纯文本。你之前的代码是把整页提取到的单块文本直接写入Excel单个单元格,自然只能得到单列的错乱结果,根本没有做结构化拆分。
可落地方案
针对带明确边框线的表格类PDF,直接用专门做PDF表格识别的Camelot库即可,不需要手动写坐标判断逻辑,识别准确率远高于原生PyPDF2。
前置依赖安装
- 先安装底层依赖Ghostscript:
- Windows:下载官方安装包,安装后把程序路径加入系统环境变量
- Mac:执行
brew install ghostscript - Linux:执行
sudo apt install ghostscript
- 安装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
相关产品推荐
相关产品推荐

