使用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
相关产品推荐
相关产品推荐

