使用camelot-py提取PDF表格触发OpenCV(-215)断言错误如何解决
核心错误定位
报错!_src.empty() in function 'cv::cvtColor'属于OpenCV底层断言失败,原因是camelot调用图像处理逻辑时传入的源图像为空,说明PDF转临时图像的步骤执行失败,没有生成有效图像数据。
具体排查方向
路径有效性校验
首先测试目标PDF文件是否能被程序正常读取,执行以下代码验证:import os pdf_file = 'C:/Users/myuser/Desktop/statement_7022035.pdf' print(os.path.exists(pdf_file))如果返回
False,修正路径写法,可尝试改用原始字符串格式r'C:\Users\myuser\Desktop\statement_7022035.pdf';如果返回True,检查PDF是否被其他程序独占打开,当前Python进程是否有文件读取权限。Ghostscript环境配置校验
即使已经安装Ghostscript,Windows环境下大概率是未将Ghostscript的bin目录加入系统PATH环境变量,导致camelot调用Ghostscript将PDF转为图像时执行失败,生成空图像。
验证方式:打开cmd窗口执行gswin64c -version(64位系统)或gswin32c -version(32位系统),如果提示找不到命令,将Ghostscript安装目录下的bin文件夹(例如C:\Program Files\gs\gs9.56.1\bin)加入系统PATH,重启虚拟环境/IDE后重试。解析模式适配调整
你当前使用的是camelot默认的lattice解析模式,该模式依赖OpenCV识别表格边框,必须经过PDF转图像的步骤。你的待处理文件是文本型PDF,更适合用不需要转图像的stream模式,修改代码如下即可跳过图像处理流程:tables = camelot.read_pdf(pdf_file, flavor='stream')如果stream模式可以正常提取数据,可直接使用该模式,不需要再排查lattice模式的依赖问题。
PDF属性验证
确认PDF没有设置加密、编辑/复制限制,也可手动指定页码测试,避免默认读取的第一页无内容导致转换失败:# 示例:读取PDF第2页 tables = camelot.read_pdf(pdf_file, pages='2', flavor='stream')
内容的提问来源于stack exchange,提问作者Garry

