长期运行的PDF Scraper突遇tabula-java报错:End-of-File, expected line
PDF爬虫突发End-of-File报错排查方案
问题描述
我正在运行一个PDF Scraper:
!pip install -q tabula-py==2.7.0 #[PDF Scraper] try: df = tabula.io.read_pdf(BytesIO(pdf_content), pandas_options={'header': None}, pages=3, stream=True)[0] except Exception as e: # 如果出现索引越界异常(说明第3页不存在),尝试读取第2页 df = tabula.io.read_pdf(BytesIO(pdf_content), pandas_options={'header': None}, pages=2, stream=True)[0] #[PDF Scraper]
该代码已稳定运行数月,未做任何更改,近期突然出现如下报错:
Error from tabula-java:
Picked up JAVA_TOOL_OPTIONS: -Djdk.jar.maxSignatureFileSize=2147483639
Error: Error: End-of-File, expected line
Error from tabula-java:
Picked up JAVA_TOOL_OPTIONS: -Djdk.jar.maxSignatureFileSize=2147483639
Error: Error: End-of-File, expected line
排查与解决方向
1. 校验目标PDF文件
- 检查近期爬取的PDF是否损坏、不完整:手动下载对应PDF,确认第2、3页能否正常打开,表格结构是否和之前一致。
- 部分PDF可能新增了加密或权限限制,即使能打开,tabula-java也无法解析,需要先解除权限限制。
2. 修复tabula-java兼容性问题
- 虽然tabula-py版本未变,但底层依赖的tabula-java可能自动更新,或系统Java环境发生变化:
- 先执行
tabula.environment_info()查看当前tabula-java版本,若版本有更新,可手动指定旧稳定版本:df = tabula.io.read_pdf(BytesIO(pdf_content), pandas_options={'header': None}, pages=3, stream=True, java_options=["-Dtabula.version=0.9.2"])[0] - 核对系统Java版本,若近期有更新,回退到之前运行正常的Java版本。
- 先执行
3. 调整PDF读取参数
- 尝试关闭
stream=True,改用默认的lattice模式(对格式变化适应性更强):df = tabula.io.read_pdf(BytesIO(pdf_content), pandas_options={'header': None}, pages=3)[0] - 添加
guess=False参数,禁止tabula自动猜测表格边界,避免解析逻辑出错:df = tabula.io.read_pdf(BytesIO(pdf_content), pandas_options={'header': None}, pages=3, stream=True, guess=False)[0]
4. 优化异常捕获逻辑
原代码异常捕获范围过宽,容易掩盖真实问题,改为只捕获索引越界和tabula专属异常:
from tabula.errors import TabulaError try: df = tabula.io.read_pdf(BytesIO(pdf_content), pandas_options={'header': None}, pages=3, stream=True)[0] except (IndexError, TabulaError) as e: df = tabula.io.read_pdf(BytesIO(pdf_content), pandas_options={'header': None}, pages=2, stream=True)[0]
内容的提问来源于stack exchange,提问作者mohamadmaarouf_
相关产品推荐
相关产品推荐

