You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyPDF2合并PDF时出现数据长度错误的排查与解决

解决PyPDF2合并PDF时的CBC模式填充错误

错误原因

你遇到的ValueError: Data must be padded to 16 byte boundary in CBC mode,本质是待合并的PDF中存在加密内容,PyPDF2的解密模块对部分CBC模式加密的PDF兼容性不足,即便安装了PyCryptodome依赖,也无法正确处理这类加密内容的字节填充逻辑。

解决方法

方法1:显式解密PDF后合并

如果PDF是权限加密(无打开密码),可以尝试用空字符串解密;如果有打开密码,替换为实际密码:

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)
        # 处理加密PDF
        if tmp.is_encrypted:
            # 无密码传空字符串,有密码替换为实际密码
            tmp.decrypt("")
        merger.append(tmp)

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

方法2:更换更兼容的PDF处理库(PyMuPDF)

PyMuPDF(fitz)对加密PDF的支持更稳定,能处理大部分PyPDF2无法兼容的加密场景,同时提取指定页面也更便捷:

import fitz
import glob

# 创建输出PDF对象
output_pdf = fitz.open()
# 获取目标文件夹下的所有PDF
pdf_files = glob.glob('C:/Users/Jake/Documents/UPLOAD/test_merge/*.pdf')

for file_path in pdf_files:
    with fitz.open(file_path) as doc:
        # 若PDF有打开密码,添加此行:doc.authenticate("你的密码")
        # 提取特定页面示例:insert_pdf(doc, from_page=0, to_page=0) 只合并第一页
        output_pdf.insert_pdf(doc)

# 保存合并后的PDF
output_pdf.save('merged.pdf')
output_pdf.close()

安装PyMuPDF:pip install pymupdf

方法3:修复损坏/异常加密的PDF

部分PDF可能因生成时的问题导致加密结构损坏,可通过Adobe Acrobat等工具打开并重新保存(选择移除加密或修复文档),再用代码处理。

内容的提问来源于stack exchange,提问作者databank-zero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:25:19