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
相关产品推荐
相关产品推荐

