【问题标题】:Error occurred while using PyPdf2 PdfFileMerger in Python在 Python 中使用 PyPdf2 PdfFileMerger 时发生错误
【发布时间】:2020-11-17 02:25:53
【问题描述】:

我一直在使用 PyPdf2 创建一个 Python 程序来合并多个 pdf 文件。

这里是代码

import os
from PyPDF2 import PdfFileMerger

source_dir = os.getcwd()

merger = PdfFileMerger()

for item in os.listdir(source_dir):
    if item.endswith('pdf'):
        merger.append(item)

merger.write('completed_file.pdf')
merger.close()

在运行代码时遇到以下错误:-

Traceback (most recent call last):
  File "F:\Python folder\Pdf_Merger\main.py", line 10, in <module>
    merger.append(item)
  File "F:\Python folder\Pdf_Merger\venv\lib\site-packages\PyPDF2\merger.py", line 203, in append
    self.merge(len(self.pages), fileobj, bookmark, pages, import_bookmarks)
  File "F:\Python folder\Pdf_Merger\venv\lib\site-packages\PyPDF2\merger.py", line 151, in merge
    outline = pdfr.getOutlines()
  File "F:\Python folder\Pdf_Merger\venv\lib\site-packages\PyPDF2\pdf.py", line 1362, in getOutlines
    outline = self._buildOutline(node)
  File "F:\Python folder\Pdf_Merger\venv\lib\site-packages\PyPDF2\pdf.py", line 1444, in _buildOutline
    outline = self._buildDestination(title, dest)
  File "F:\Python folder\Pdf_Merger\venv\lib\site-packages\PyPDF2\pdf.py", line 1425, in _buildDestination
    return Destination(title, page, typ, *array)
  File "F:\Python folder\Pdf_Merger\venv\lib\site-packages\PyPDF2\generic.py", line 1065, in __init__
    raise utils.PdfReadError("Unknown Destination Type: %r" % typ)
PyPDF2.utils.PdfReadError: Unknown Destination Type: 0

Process finished with exit code 1

注意 - 我确保没有任何 pdf 文件受到密码保护。

【问题讨论】:

  • 欢迎来到 SO。尝试打印出物品,看看它窒息了哪个物品。
  • 我已经尝试过在 merge.append(item) 之后使用 print(item) 并且我收到了第一个文件的名称,它在第二次循环时抛出错误。
  • 这可能对你有帮助:github.com/mstamy2/PyPDF2/issues/193

标签: python python-3.x exception pypdf2 pypdf


【解决方案1】:

这似乎是由您尝试合并的其中一个 PDF 的大纲中的错误目标语法引起的。

如果您不关心大纲,您应该可以通过将PdfFileMerger.append 中的import_bookmarks kwarg 更新为False 来解决此问题,如下所示:

import os
from PyPDF2 import PdfFileMerger

source_dir = os.getcwd()

merger = PdfFileMerger()

for item in os.listdir(source_dir):
    if item.endswith('pdf'):
        merger.append(item, import_bookmarks=False)

merger.write('completed_file.pdf')
merger.close()

更多细节

PdfFileMerger.append 调用PdfFileMerger.merge 并将import_bookmarks kwarg 传递给它。默认设置为True

PyPDF2.generic 中,Destination 类在初始化期间引发此错误。合并试图通过从原始大纲中读取目的地来将目的地构建到新大纲中。

def __init__(self, title, page, typ, *args):
    DictionaryObject.__init__(self)
    self[NameObject("/Title")] = title
    self[NameObject("/Page")] = page
    self[NameObject("/Type")] = typ

    # from table 8.2 of the PDF 1.7 reference.
    if typ == "/XYZ":
        (self[NameObject("/Left")], self[NameObject("/Top")],
            self[NameObject("/Zoom")]) = args
    elif typ == "/FitR":
        (self[NameObject("/Left")], self[NameObject("/Bottom")],
            self[NameObject("/Right")], self[NameObject("/Top")]) = args
    elif typ in ["/FitH", "/FitBH"]:
        self[NameObject("/Top")], = args
    elif typ in ["/FitV", "/FitBV"]:
        self[NameObject("/Left")], = args
    elif typ in ["/Fit", "/FitB"]:
        pass
    else:
        raise utils.PdfReadError("Unknown Destination Type: %r" % typ)

根据PDF Reference 1.7,由于目标类型“0”不是有效类型,因此会引发错误。

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多