使用Camelot将PDF表格转换为Pandas DataFrame时的多列文件解析异常问题
PDF表格转Pandas DataFrame:Camelot解析差异问题排查与解决
我最近在搭建一套简便的PDF表格数据提取工具,目标是把PDF里的表格直接转成Pandas DataFrame,基础代码如下:
import camelot import pandas as pd pdf = camelot.read_pdf("file1.pdf") print(pdf[0].df)
测试了两个PDF文件后遇到了一个奇怪的问题:
- File 1用默认配置就能完美解析,表格数据完整提取到DataFrame里
- File 2默认情况下完全拿不到任何数据——它的列数确实比File 1多,但我不认为这是核心障碍。后来试着给
read_pdf方法加上flavor="stream"参数,居然成功从File 2里提取到了完整的表格数据。
解析结果对比
File 1解析结果(默认lattice模式)
| ID | 产品名称 | 单价 | 库存 |
|---|---|---|---|
| 1 | 笔记本 | 3999 | 120 |
| 2 | 鼠标 | 99 | 500 |
File 2解析结果(stream模式)
| 订单号 | 客户名称 | 联系电话 | 收货地址 | 下单日期 | 商品清单 |
|---|---|---|---|---|---|
| OD2024001 | 张三 | 138xxxx1234 | 北京市朝阳区 | 2024-01-01 | 键盘×2 |
| OD2024002 | 李四 | 139xxxx5678 | 上海市浦东新区 | 2024-01-02 | 显示器×1 |
问题原因分析
Camelot默认用的lattice模式是靠PDF里的表格边框线来识别表格结构的,如果File 2的表格是无框线设计,或者边框线非常淡、甚至是用空格/缩进模拟的列分隔,lattice模式就会识别失败。而stream模式是基于文本的位置、间距来推断列的边界,刚好适配这类没有明确物理边框的表格。
后续优化建议
如果需要批量处理不同类型的PDF,可以考虑做个简单的逻辑判断:
- 先尝试默认的lattice模式提取,若返回的表格为空或数据异常,自动切换到stream模式
- 针对stream模式,还可以通过
table_regions参数指定表格在页面的坐标范围,或者用columns手动定义列分隔的位置,进一步提升提取精度
内容的提问来源于stack exchange,提问作者Vini Cassol
相关产品推荐
相关产品推荐

