使用Camelot提取无列分隔线PDF表格的问题求助
无列分隔线PDF表格提取问题及解决方法
我需要从一份无内部列分隔线的PDF中提取表格,文档截图如下:
已尝试的操作及问题
- 默认方式提取
运行代码:
tables = camelot.read_pdf(filename) print(tables[0].df)
提取到的内容正确,但所有数据被识别为单列,输出示例:
0 Credit \nDate \nReference No. \nDescription... 1 09/10/2016 \n3194949206 \nOnline Banking tra... 2 09/20/2016 \n3194749206 \nOnline Banking tra... 3 09/20/2016 \n34236757678 \nCA TLR cash withd... 4 10/08/2016 \n5444 \nInterest \n ...
执行print(tables[0].df.shape)返回结果为(5, 1)。
- 使用
flavor='stream'提取
运行代码:
tables = camelot.read_pdf(filename, flavor='stream')
提取结果错误,获取到了页面上的银行信息而非目标表格,输出示例:
0 1 0 Bank of Domino 1 Customer service information 2 P.O. Box 15001 1.888.DOMINO 3 Arlington, VA 18505 TDD/TTY users only: 1.800.288.4101 4 En Espanol: 1.800.688.6229 5 Account Number: 00000970987652 bankofdomino.com 6 ROBERT BELL Bank of Domino, N.A. 7 HOLLOW WAY,APT 503 P.O. Box 25125 8 SAN MESA, CA 92627-5125 San Mesa,CA 33390
该DataFrame的形状为(9, 2)。
- 指定列x坐标提取
运行代码:
tables = camelot.read_pdf(filename, flavor='stream', columns="10, 120, 230, 470, 520, 650, 720, 800")
依旧提取到错误数据。
可行解决方法
针对无列分隔线的表格,需结合flavor='stream'、精准列坐标和表格区域限定来提取:
- 限定表格区域:先确定目标表格在PDF页面中的坐标范围(可通过PDF阅读器的坐标显示功能,或Camelot的可视化工具辅助),比如该表格的区域可设为
table_areas=["10, 600, 850, 200"](需根据实际PDF调整数值),避免误提取页面其他内容。 - 精准测量列坐标:用截图工具查看表格各列的分隔像素位置,转换为PDF坐标(注意PDF的坐标原点在页面左下角),确保列坐标准确对应每列的边界。
- 最终代码示例:
tables = camelot.read_pdf( filename, flavor='stream', table_areas=["10, 600, 850, 200"], # 限定目标表格的区域 columns=["10, 120, 230, 470, 520, 650, 720, 800"] # 精准列分隔坐标 ) print(tables[0].df)
如果上述方法效果不佳,还可以尝试:
- 运行
camelot.plot(tables[0], kind='contour')可视化表格检测区域,根据结果调整table_areas和columns参数。 - 对PDF进行预处理,比如添加虚拟列分隔线或调整对比度,再进行提取。
- 尝试其他表格提取工具(如
tabula-py),同样使用区域和列坐标参数来定位表格。
内容的提问来源于stack exchange,提问作者aziz aon
相关产品推荐
相关产品推荐

