You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyPDF2提取PDF文本时部分页面报Unexpected end of stream错误求助

解决PyPDF2提取PDF文本时"Unexpected end of stream"错误

错误原因分析

"Unexpected end of stream"错误核心指向PDF文件的结构损坏:

  • 异常页面的/Contents间接对象(比如你示例中的IndirectObject(40, 0, 1815281175584))对应的数据流被截断、损坏,或是压缩格式不符合PDF规范。
  • 这类问题多源于PDF生成时的异常中断、文件传输过程中的损坏,或是某些非标准PDF编辑器的不规范保存操作。对比你提供的正常/异常页面字典,资源数量差异并非直接诱因,核心问题仍在内容流的完整性上。

可行解决方案

1. 先修复PDF文件

使用Ghostscript重新生成符合规范的PDF,修复流截断问题:

gs -o repaired.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress your_corrupted.pdf

修复后再用PyPDF2提取,多数流损坏问题会被解决。

2. 异常页面降级到pdfminer.six提取

利用pdfminer更强的兼容性,在代码中添加异常捕获,对出错页面单独处理:

from PyPDF2 import PdfReader, PdfStreamError
from pdfminer.high_level import extract_text as pdfminer_extract

reader = PdfReader(pdf_path)
full_text = []

for idx, page in enumerate(reader.pages):
    try:
        text = page.extract_text()
        full_text.append(text)
    except PdfStreamError:
        # pdfminer页码从1开始,需转换索引
        page_text = pdfminer_extract(pdf_path, page_numbers=[idx+1])
        full_text.append(page_text)

final_text = "\n".join(full_text)

3. 排查具体损坏点

若需定位问题根源,可以查看异常页面/Contents对象的原始数据:

from PyPDF2 import PdfReader

reader = PdfReader(pdf_path)
# 替换为你的异常页面索引
problem_page = reader.pages[your_problem_page_index]
contents_obj = reader._get_object(problem_page["/Contents"])
try:
    decoded = contents_obj.get_data()
    print(f"流长度: {len(decoded)}")
except Exception as e:
    print(f"解码失败: {e}")

如果解码失败,说明该对象的流已无法修复,只能依赖修复工具或替代库处理。

内容的提问来源于stack exchange,提问作者Robert Gates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:15:34