当我使用以下代码时
from PyPDF2 import PdfFileMerger
merge = PdfFileMerger()
for newFile in nlst:
merge.append(newFile)
merge.write('newFile.pdf')
发生了以下事情:
raise utils.PdfReadError("EOF marker not found")
PyPDF2.utils.PdfReadError: EOF marker not found
任何人都可以告诉我发生了什么?感谢
答案 0 :(得分:3)
PDF是一种文件格式,pdf解析器通常通过读取位于文件末尾的一些全局信息来开始读取文件。在文档的最后,需要有一行内容
%% EOF
这是一个标记,pdf解析器知道PDF文档在这里结束并且它需要的全局信息应该在此之前(startxref部分)。
我猜,您看到的错误消息表示其中一个输入文档被截断并且缺少此%% EOF标记。
答案 1 :(得分:2)
在使用 camelot
和 PyPDF2
遇到这个问题后,我做了一些挖掘并解决了问题。
文件结束标记 '%%EOF'
应该是最后一行,但是一些 PDF 文件在这一行之后放了一大块 javascript,读者无法找到 EOF。
打开 EOF 和 javascript 后的样子:
b'>>\r\n',
b'startxref\r\n',
b'275824\r\n',
b'%%EOF\r\n',
b'\n',
b'\n',
b'<script type="text/javascript">\n',
b'\twindow.parent.focus();\n',
b'</script><!DOCTYPE html>\n',
b'\n',
b'\n',
b'\n',
所以你只需要在 javascript 开始之前截断文件。
解决方案:
def reset_eof_of_pdf_return_stream(pdf_stream_in:list):
# find the line position of the EOF
for i, x in enumerate(txt[::-1]):
if b'%%EOF' in x:
actual_line = len(pdf_stream_in)-i
print(f'EOF found at line position {-i} = actual {actual_line}, with value {x}')
break
# return the list up to that point
return pdf_stream_in[:actual_line]
# opens the file for reading
with open('data/XXX.pdf', 'rb') as p:
txt = (p.readlines())
# get the new list terminating correctly
txtx = reset_eof_of_pdf_return_stream(txt)
# write to new pdf
with open('data/XXX_fixed.pdf', 'wb' as f:
f.writelines(txtx)
fixed_pdf = PyPDF2.PdfFileReader('data/XXX_fixed.pdf')
答案 2 :(得分:1)
此问题的一种简单解决方案(未找到EOF标记)。在其他应用程序中打开您的 .pdf 文件(我在Ubuntu 18.04中使用Libre office draw)。然后将文件导出为 .pdf 。使用此导出的 .pdf 文件,该问题将不会持续。
答案 3 :(得分:0)
我也遇到了这个问题并找到了解决方案。
首先,python将PDF读取为size_t sampleSize = 4;
或'rb'
作为二进制读写格式。
文件结束
在一行上某处有一个开放的括号,但没有匹配的封闭括号时发生。在寻找右括号时,Python到达了文件的末尾。
这是第一种解决方案:
使用此命令关闭您之前打开的文件
'wb'
检查是否使用其他变量打开了pdf文件,然后再次将其关闭
newfile.close()
现在只打开一次并使用它,就可以了。