不明白这个 PdfReadError:找不到 EOF 标记



我正在下载多个PDF。我有一个网址列表,编写代码是为了下载它们,并创建一个大的pdf。该代码适用于前 144 个 pdf,然后抛出此错误:

PdfReadError: 找不到 EOF 标记

我尝试让所有 pdf 都以 %%EOF 结尾,但这不起作用 - 它仍然达到相同的点,然后我再次收到错误。

这是我的代码:

我的文件并转换为列表以供 Python 单独读取每个

with open('minutelinks.txt', 'r') as file:
    data = file.read() 
links = data.split()

下载 PDF 文件

from PyPDF2 import PdfFileMerger
import requests
urls = links 
merger = PdfFileMerger()
for url in urls:
    response = requests.get(url)
    title = url.split("/")[-1]
    with open(title, 'wb') as f:
        f.write(response.content)
        merger.append(title)
merger.write("allminues.pdf")
merger.close()

我希望能够下载所有这些并创建一个大的pdf - 它似乎一直这样做,直到它抛出此错误。我有大约 750 个 pdf,但它只能达到 144 个。

这就是我更改代码的方式,因此它现在下载所有 pdf 并跳过可能相关的一个(或多个(。我还必须将self参数添加到函数中。

from PyPDF2 import PdfFileMerger
import requests
import sys
urls = links 
def download_pdfs(self):
    merger = PdfFileMerger()
    for url in urls:
        try:
            response = requests.get(url)
            title = url.split("/")[-1]
            with open(title, 'wb') as f:
                f.write(response.content)
        except PdfReadError:
            print(title) 
            sys.exit()
    merger.append(title)
    merger.write("allminues.pdf")
    merger.close()

文件标记 '%%EOF' 的末尾是最后一行。它是一种标记,pdf解析器知道PDF文档到此结束。

我的解决方案是强制此标记保留在末尾:

def reset_eof(self, pdf_file):
    with open(pdf_file, 'rb') as p:
        txt = (p.readlines())
    for i, x in enumerate(txt[::-1]):
        if b'%%EOF' in x:
            actual_line = len(txt)-i-1
            break
    txtx = txt[:actual_line] + [b'%%EOF']
    with open(pdf_file, 'wb') as f:
        f.writelines(txtx)
    return PyPDF4.PdfFileReader(pdf_file)

我读到EOF是一种包含在PDF文件中的标签。 葡萄牙语链接

但是,我猜某些类型的PDF文件没有"EOF标记",并且PyPDF2无法识别这些标记。

因此,我所做的修复"PdfReadError:未找到EOF标记"的是使用Google Chromer打开我的PDF,并再次将其打印为.pdf,以便通过Chromer将文件转换为.pdf,并希望使用EOF标记。

我使用Chromer转换的新.pdf文件运行了我的脚本,它工作正常。

最新更新