使用pypdf处理PDF时遇'endstream'标记缺失错误求助
PdfReadError问题 执行以下代码时触发PdfReadError,错误提示无法找到对应对象的endstream标记:
from pypdf import PdfReader,PdfWriter import traceback try: input_pdf = PdfReader(dwnld_filepath) output_pdf = PdfWriter() image = input_pdf.pages[0] output_pdf.add_page(image) output_pdf.write(file_path) except Exception as e: traceback.print_exc()
完整回溯信息:
Traceback (most recent call last):
File "/Users/shafeerali/Documents/Nanonets/avanto/API/test.py", line 58, in
output_pdf.add_page(image)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/_writer.py", line 418, in add_page
return self._add_page(page, list.append, excluded_keys)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/_writer.py", line 331, in _add_page
page = cast("PageObject", page_org.clone(self, False, excluded_keys))
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 199, in clone
d.._clone(self, pdf_dest, force_duplicate, ignore_fields, visited)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 310, in _clone
v.clone(pdf_dest, force_duplicate, ignore_fields)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 199, in clone
d.._clone(self, pdf_dest, force_duplicate, ignore_fields, visited)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 310, in _clone
v.clone(pdf_dest, force_duplicate, ignore_fields)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 199, in clone
d.__._clone(self, pdf_dest, force_duplicate, ignore_fields, visited)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 310, in _clone
v.clone(pdf_dest, force_duplicate, ignore_fields)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_base.py", line 300, in clone
obj.clone(pdf_dest, force_duplicate, ignore_fields)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 116, in clone
arr.append(data.clone(pdf_dest, force_duplicate, ignore_fields))
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_base.py", line 292, in clone
obj = self.get_object()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_base.py", line 312, in get_object
obj = self.pdf.get_object(self)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/_reader.py", line 1401, in get_object
retval = read_object(self.stream, self) # type: ignore
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 1280, in read_object
return DictionaryObject.read_from_stream(stream, pdf, forced_encoding)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 538, in read_from_stream
data["streamdata"] = read_unsized_from_steam(stream, pdf)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pypdf/generic/_data_structures.py", line 432, in read_unsized_from_steam
raise PdfReadError(
pypdf.errors.PdfReadError: Unable to find 'endstream' marker for obj starting at 13367.
解决方案
该错误源于目标PDF文件本身存在结构损坏(缺失endstream标记),可尝试以下方法解决:
更新pypdf到最新版本
新版本pypdf可能修复了此类兼容性问题,执行命令升级:pip install --upgrade pypdf用第三方工具修复PDF结构
使用qpdf或pdftk先修复损坏的PDF,再用pypdf处理。以qpdf为例:- 安装qpdf(根据系统用
brew install qpdf、apt install qpdf等命令) - 执行修复命令:
qpdf --repair-input EveBest.pdf repaired_EveBest.pdf - 使用修复后的
repaired_EveBest.pdf作为输入文件运行代码。
- 安装qpdf(根据系统用
替换为其他PDF处理库
若上述方法无效,可尝试使用PyMuPDF(fitz)替代pypdf,代码示例:import fitz input_pdf = fitz.open("EveBest.pdf") output_pdf = fitz.open() output_pdf.insert_pdf(input_pdf, from_page=0, to_page=0) output_pdf.save("output.pdf") output_pdf.close() input_pdf.close()
内容的提问来源于stack exchange,提问作者MUHAMMED SHAFEERALI P

