Python提取PDF表格结构化数据:pdftotext无法识别表格数据
嘿,我太懂你这种困扰了——用pdftotext把PDF转成纯文本后,表格的结构直接就没了,行和列混在一起根本没法区分对吧?别纠结纯文本转换了,Python里有专门针对PDF表格提取的工具,能直接帮你把表格转成JSON、HTML、CSV这些结构化格式,给你分享几个实用的方案:
方案1:用Tabula-py提取表格(最常用)
Tabula-py是基于Java版Tabula的Python封装,专门用来识别PDF里的表格,支持导出JSON、CSV、HTML等格式,还能直接转成Pandas DataFrame方便后续处理。
先安装(注意需要提前装Java环境,因为底层依赖Java):
pip install tabula-py示例代码:
import tabula import json # 提取第1页的表格,pages可以设为'all'提取所有页面,或者页码列表比如[2,5] tables = tabula.read_pdf("your_target.pdf", pages=1, output_format="json") # 保存为JSON文件 with open("extracted_table.json", "w", encoding="utf-8") as f: json.dump(tables, f, indent=4, ensure_ascii=False) # 如果要转HTML,先转成DataFrame再导出 df = tabula.read_pdf("your_target.pdf", pages=1)[0] df.to_html("table_output.html", index=False)
如果表格位置比较特殊,还可以用area参数指定表格的坐标区域(比如area=[top, left, bottom, right]),精准定位提取。
方案2:用Camelot-py处理复杂表格
Camelot更擅长处理一些布局复杂的表格,比如无边框的表格(靠文本间距识别),它支持lattice(有边框表格)和stream(无边框表格)两种模式。
安装(需要OpenCV依赖,所以装带cv的版本):
pip install camelot-py[cv]示例代码:
import camelot # 提取第1页的有边框表格,用lattice模式;如果是无边框的,把flavor改成'stream' tables = camelot.read_pdf("your_target.pdf", pages='1', flavor='lattice') # 导出为JSON格式 tables.export("table_result.json", f="json") # 查看提取的表格内容 print(tables[0].df.head())
它还支持可视化检查提取结果,用tables[0].plot()可以生成表格的预览图,方便你调整参数优化提取效果。
额外提示
- 如果你的PDF是加密的,需要先解密(可以用PyMuPDF库处理)再提取;
- 如果表格是扫描件(图片格式的PDF),那需要结合OCR工具,比如用PyMuPDF提取图片,再用Tesseract OCR识别文本,最后再用表格识别工具处理,不过这种情况复杂度会高一些;
- 这两个工具都能保留表格的行列结构,比纯文本转换靠谱太多啦!
内容的提问来源于stack exchange,提问作者Shivam Singh




