如何用Python提取PDF单行表格数据?Camelot提取失败求方案
解决Camelot无法提取PDF单行表格的问题
Camelot默认的lattice模式依赖完整表格边框识别,单行表格如果边框不完整或缺失,很容易被漏检。以下是几个实用解决办法:
1. 切换到Stream模式提取
Stream模式基于文本间距识别表格,适合无框或边框不全的单行表格,同时可调整行容差参数避免单行被忽略:
import camelot file = 'IR-E-U-0306.pdf' # 使用stream模式,row_tol控制行合并的容差(值越大,越容易将邻近文本识别为同一行) tables = camelot.read_pdf(file, pages="all", flavor='stream', row_tol=10) # 遍历所有表格,找到目标单行表格 for idx, table in enumerate(tables): print(f"表格 {idx} 内容:") print(table.df) print("---")
2. 指定表格区域精准提取
如果目标单行表格在页面中的位置固定,可以通过指定坐标区域强制提取:
- 用PDF阅读器查看目标表格的坐标(Camelot以页面左下角为原点,坐标格式为
x1,y1,x2,y2) - 在代码中添加
table_regions参数定位:
# 示例:假设目标单行表格在第6页,坐标为(50, 100, 750, 150),需根据实际调整 tables = camelot.read_pdf(file, pages="6", flavor='stream', table_regions=['50,100,750,150']) print(tables[0].df)
3. 结合Tabula-Py补充提取
如果Camelot仍无法识别,可尝试用Tabula-Py作为补充,它对部分不规则单行表格的支持更友好:
import tabula # 提取第6页的所有表格 dfs = tabula.read_pdf(file, pages="6", multiple_tables=True) # 筛选出单行表格 for df in dfs: if len(df) == 1: print("找到单行表格:") print(df)
关键参数说明
flavor='stream':切换到文本间距识别模式,替代默认的边框识别row_tol:控制行的合并容差,值越大,越容易将垂直方向邻近的文本判定为同一行table_regions:限定提取的区域,减少页面其他元素的干扰
内容的提问来源于stack exchange,提问作者Anuva Goyal
相关产品推荐
相关产品推荐

