【问题标题】:EOF marker not found while use PyPDF2 merge pdf file in python在python中使用PyPDF2合并pdf文件时找不到EOF标记
【发布时间】:2017-07-29 14:50:31
【问题描述】:

当我使用以下代码时

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

谁能告诉我发生了什么事?谢谢

【问题讨论】:

  • 此错误可能由非 pdf 文件的讲座发生。使用“for in”时要小心,并打印错误以注意发生了什么。

标签: python pdf pypdf2


【解决方案1】:

在使用camelotPyPDF2遇到这个问题后,我做了一些挖掘并解决了这个问题。

文件结束标记 '%%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】:

    PDF 是一种文件格式,pdf 解析器通常通过读取位于文件末尾的一些全局信息来开始读取文件。在文档的最后,需要有一行内容是

    %%EOF

    这是一个标记,pdf 解析器知道 PDF 文档在此处结束,并且它需要的全局信息应该在此之前(一个 startxref 部分)。

    我猜,您看到的错误消息意味着其中一个输入文档已被截断并且缺少此 %%EOF 标记。

    【讨论】:

      【解决方案3】:

      此问题的一个简单解决方案(未找到 EOF 标记)。在其他应用程序中打开您的 .pdf 文件(我在 Ubuntu 18.04 中使用了 Libre office draw)。然后将文件导出为 .pdf。使用这个导出的 .pdf 文件问题不会持续存在。

      【讨论】:

        【解决方案4】:

        我也遇到了这个问题并找到了解决方案。

        首先,python 将 PDF 读取为'rb''wb' 作为二进制读写格式。

        文件结束

        当一行的某处有一个左括号,但没有匹配的右括号时发生。 Python 在查找右括号时到达了文件的末尾。

        这是 1 个解决方案:

        1. 使用此命令关闭您之前打开的文件

          newfile.close()

        2. 检查该pdf是否使用其他变量打开并再次关闭它

          Same_file_with_another_variable.close()

        现在只打开一次就可以使用了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多