Python使用tabula提取PDF数据时Colab与本地环境的依赖报错问题
Colab环境解决方案
- 首先执行如下命令安装缺失的JAI依赖包,Colab预装了Java环境,只需将对应jar包放入tabula-py的依赖目录即可:
# 1. 自动获取tabula-py的安装路径 import tabula import os tabula_path = os.path.dirname(tabula.__file__) # 2. 下载JPEG2000格式解析所需的JAI依赖jar包 !wget -P $tabula_path https://repo1.maven.org/maven2/com/github/jai-imageio/jai-imageio-core/1.4.0/jai-imageio-core-1.4.0.jar !wget -P $tabula_path https://repo1.maven.org/maven2/com/github/jai-imageio/jai-imageio-jpeg2000/1.4.0/jai-imageio-jpeg2000-1.4.0.jar
- 依赖安装完成后重启Colab运行时即可生效。
本地运行依赖安装方案
- 前置要求:本地已安装Java 8及以上版本,且已配置好JAVA_HOME环境变量
- 安装方式1:执行和Colab一致的Python代码获取tabula-py安装路径,手动将下载好的
jai-imageio-core、jai-imageio-jpeg2000两个jar包放入该路径下即可 - 安装方式2:无需移动jar包,调用
read_pdf时增加参数指定依赖路径:
tb.read_pdf( # 其他原有参数不变 java_options=["-cp", "/本地存放jai jar包的目录/*"] )
代码修复优化
原有代码未对解析结果做合法性判断,当部分页面解析失败返回空结构时会触发IndexError,修改后代码如下:
import tabula as tb import PyPDF2 from PyPDF2 import PdfFileReader box = [2,0,4,13] fc = 28.28 for i in range(len(box)): box[i] *= fc for filename in files: # 改用with语句自动管理文件句柄 with open(filename,'rb') as pdftemp: pdfReader = PyPDF2.PdfFileReader(pdftemp) pagestmp = pdfReader.getNumPages() pages = [i+3 for i in range(pagestmp-2)] # 跳过前2页 # 增加silent参数减少不必要的警告输出 regions_raw = tb.read_pdf(filename, pages=pages, area=[box], output_format="json", silent=True) regions = [] for item in regions_raw: data = item.get('data', []) # 多层判断避免空结构索引报错 if data and len(data) > 0 and len(data[0]) > 0: regions.append(data[0][0].get('text', '')) print(regions)
内容的提问来源于stack exchange,提问作者Andreas Theil
相关产品推荐
相关产品推荐

