在python中使用PyPDF2合并pdf文件时未找到EOF标记

os8fio9y  于 2022-12-25  发布在  Python
关注(0)|答案(6)|浏览(453)

当我使用下面的代码时

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

有人能告诉我发生了什么吗?

ztmd8pv5

ztmd8pv51#

在使用camelotPyPDF2遇到这个问题后,我做了一些挖掘,已经解决了这个问题。
文件结束标记'%%EOF'应该是最后一行,但是一些PDF文件在这一行之后放了一大块javascript,读者找不到EOF。
如果您打开EOF plus 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')
uxh89sit

uxh89sit2#

PDF是一种文件格式,其中PDF解析器通常通过读取位于文件末尾的一些全局信息来开始读取文件。在文档的最末尾需要有一行内容为
%%EOF
这是一个标记,pdf解析器知道PDF文档在此结束,它需要的全局信息应该在此之前(startxref部分)。
我猜想,您看到的错误消息意味着其中一个输入文档被截断,并且缺少%%EOF标记。

2g32fytz

2g32fytz3#

这个问题的一个简单的解决方案(EOF标记找不到)。打开您的**.pdf文件在其他应用程序(我用Libre办公室绘制在Ubuntu 18.04)。然后导出文件为.pdf**。使用这个导出的**.pdf**文件的问题将不会持续。

webghufk

webghufk4#

我也有这个问题,也有解决办法。
首先,python以'rb''wb'的二进制读写格式读取PDF。

文件结束

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

以下是1个解决方案:

1.使用以下命令关闭之前打开的文件
newfile.close()
1.检查是否使用其他变量打开该pdf,然后再次关闭它
Same_file_with_another_variable.close()
现在只打开一次,使用它,你就可以走了。

webghufk

webghufk5#

我想在这个问题上加上我的hacky解决方案。
我在python请求(application/pdf)时也遇到了同样的错误。在我的例子中,提供商(一个运输标签服务)确实给予了一个200和一个代表PDF的b '字符串,但在一些随机的情况下,它错过了EOF标记。
因为它是随机的,所以我想出了下面的解决方案:

for obj in label_objects:
    get_label = api.get_label(label_id=obj.label_id)
    while not 'EOF' in str(get_label.content):
        get_label = api.get_label(label_id=obj.label_id)

在几次尝试中,它给出了带有EOF的b字符串,我们可以继续了。

6ovsh4lw

6ovsh4lw6#

PyPDF2无法在加密的PDF中找到EOF标记。
我遇到了同样的错误,而我正在通过(优秀)自动化无聊的东西。第15章,第2版,第355页,项目组合选择页面从许多pdf。
我选择将我在本章中制作的所有PDF文件合并到一个文档中,其中一个是加密的PDF文件,当项目到达加密文档的末尾时失败,并显示错误消息:
PyPDF2.utils.PdfReadError:未找到EOF标记
我将加密文件移到了另一个文件夹(这样它就不会与其他PDF合并,项目运行良好。
因此,似乎PyPDF2无法在加密的PDF中找到EOF标记。

相关问题