【问题标题】:Data Length Error when Merging PDFs with PyPDF2使用 PyPDF2 合并 PDF 时出现数据长度错误
【发布时间】:2022-12-04 20:42:42
【问题描述】:

我正在启动一个项目,该项目将从文件夹中的每个 PDF 中取出特定页面,并将这些页面合并到一个文件中。在构建关于加密长度的引用代码时,我收到以下错误,我不知道我需要在哪里解决这个问题。

from PyPDF2 import PdfFileMerger
import glob

files = glob.glob('C:/Users/Jake/Documents/UPLOAD/test_merge/*.pdf')

merger = PdfFileMerger()

for file in files:
    merger.append(file)
merger.write("merged.pdf")
merger.close()

错误

Traceback (most recent call last):
  File "C:\Users\Jake\Documents\Work Projects\Python\Contract Merger\Merger .02", line 10, in <module>
    merger.write("merged.pdf")
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_merger.py", line 312, in write
    my_file, ret_fileobj = self.output.write(fileobj)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_writer.py", line 838, in write
    self.write_stream(stream)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_writer.py", line 811, in write_stream
    self._sweep_indirect_references(self._root)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_writer.py", line 960, in _sweep_indirect_references
    data = self._resolve_indirect_object(data)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_writer.py", line 1005, in _resolve_indirect_object
    real_obj = data.pdf.get_object(data)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_reader.py", line 1187, in get_object
    retval = self._encryption.decrypt_object(
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_encryption.py", line 747, in decrypt_object
    return cf.decrypt_object(obj)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_encryption.py", line 185, in decrypt_object
    obj[dictkey] = self.decrypt_object(value)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_encryption.py", line 179, in decrypt_object
    data = self.strCrypt.decrypt(obj.original_bytes)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_encryption.py", line 87, in decrypt
    d = aes.decrypt(data)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\Crypto\Cipher\_mode_cbc.py", line 246, in decrypt
    raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size)
ValueError: Data must be padded to 16 byte boundary in CBC mode
[Finished in 393ms]

我根据 YouTube 视频编写了一个基本程序并尝试运行它,但我得到了 PyCryptodome 是 PyPDF2 的依赖项的错误。安装后,我在编写 pdf 时收到有关加密数据长度的错误。谷歌搜索该错误将我带到this solution。我有点新手,我真的不明白为什么首先要应用任何类型的加密,除了我认为 pdf 阅读器/编写器运行所必需的,所以我不知道我需要在此代码中应用该解决方案的地方。

写完这个问题后,我被引导到this solution,我尝试运行下面的代码,我收到了同样的错误。

from PyPDF2 import PdfFileMerger, PdfFileReader
import glob

merger = PdfFileMerger()

files = glob.glob('C:/Users/Jake/Documents/UPLOAD/test_merge/*.pdf')

for filename in files:
    with open(filename, 'rb') as source:
        tmp = PdfFileReader(source)
        merger.append(tmp)

merger.write('Result.pdf')

错误

Traceback (most recent call last):
  File "C:\Users\Jake\Documents\Work Projects\Python\Contract Merger\Merger .03.py", line 13, in <module>
    merger.write('Result.pdf')
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_merger.py", line 312, in write
    my_file, ret_fileobj = self.output.write(fileobj)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_writer.py", line 838, in write
    self.write_stream(stream)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_writer.py", line 811, in write_stream
    self._sweep_indirect_references(self._root)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_writer.py", line 960, in _sweep_indirect_references
    data = self._resolve_indirect_object(data)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_writer.py", line 1005, in _resolve_indirect_object
    real_obj = data.pdf.get_object(data)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_reader.py", line 1187, in get_object
    retval = self._encryption.decrypt_object(
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_encryption.py", line 747, in decrypt_object
    return cf.decrypt_object(obj)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_encryption.py", line 185, in decrypt_object
    obj[dictkey] = self.decrypt_object(value)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_encryption.py", line 179, in decrypt_object
    data = self.strCrypt.decrypt(obj.original_bytes)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\PyPDF2\_encryption.py", line 87, in decrypt
    d = aes.decrypt(data)
  File "C:\Users\Jake\Anaconda3\lib\site-packages\Crypto\Cipher\_mode_cbc.py", line 246, in decrypt
    raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size)
ValueError: Data must be padded to 16 byte boundary in CBC mode
[Finished in 268ms]

我的想法是其他地方出了问题,但我不知道那可能是什么。

我在这个构建中做错了什么导致出现这个错误,我该如何纠正它?

【问题讨论】:

    标签: pdf merge pypdf2 pycryptodome


    【解决方案1】:

    原来这是an issue with PyPDF2。有一个 3-line fix 可以被注入以纠正错误,如果你在它被修补之前尝试这样做。

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2017-04-17
      • 2020-04-28
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多