PyPDF2脚本OSError[Errno22]报错求助:批量PDF加水印功能异常
解决OSError: [Errno 22] Invalid Argument的PDF加水印脚本问题
你的问题大概率是修改代码时引入了两个关键错误:一是误将文件夹当作PDF文件读取,二是目标文件路径构造不规范。我来帮你一步步排查和修复:
1. 错误根源拆解
报错出现在PyPDF2.PdfFileReader(source_open)的stream.seek(-1, 2)操作,这个错误的核心原因是你试图打开的不是有效的PDF文件——具体来说,os.listdir()会返回当前目录下所有条目(包括文件和文件夹),如果恰好有个文件夹名字以.pdf结尾(比如误命名的old_pdfs.pdf文件夹),你的if i.endswith('.pdf')判断会把它当成PDF文件处理,用open()去打开文件夹自然会抛出无效参数的错误。
另外,你提到修改代码是为了把处理后的PDF移到目标文件夹,但当前代码还是在覆盖原文件,说明你可能在修改时路径拼接有误(比如直接用字符串拼接而非os.path.join),这也会引发路径类错误。
2. 修复后的完整代码
下面是修复后的脚本,既解决了报错问题,也实现了将处理后的PDF保存到目标文件夹的需求:
import PyPDF2 import os import sys def watermark_pdfs(watermark_path, source_dir, dest_dir): # 创建目标文件夹(支持多级目录) if not os.path.exists(dest_dir): os.makedirs(dest_dir) # 读取水印PDF with open(watermark_path, 'rb') as watermark_file: watermark_reader = PyPDF2.PdfFileReader(watermark_file) watermark_page = watermark_reader.getPage(0) # 遍历源目录下的PDF文件 for filename in os.listdir(source_dir): # 确保是PDF文件,且是真实文件(排除文件夹) if filename.endswith('.pdf') and os.path.isfile(os.path.join(source_dir, filename)): source_file_path = os.path.join(source_dir, filename) dest_file_path = os.path.join(dest_dir, filename) # 读取源PDF并加水印 with open(source_file_path, 'rb') as source_file: source_reader = PyPDF2.PdfFileReader(source_file) writer = PyPDF2.PdfFileWriter() # 给每一页加水印(如果只需要最后一页,可改回你原有的逻辑) for page_num in range(source_reader.getNumPages()): page = source_reader.getPage(page_num) page.mergePage(watermark_page) writer.addPage(page) # 将处理后的PDF写入目标文件夹 with open(dest_file_path, 'wb') as dest_file: writer.write(dest_file) print(f"处理完成: {dest_file_path}") if __name__ == "__main__": # 校验命令行参数 if len(sys.argv) != 4: print("用法: python pdf_watermarker_v2.py <水印PDF路径> <源文件夹路径> <目标文件夹路径>") sys.exit(1) watermark = sys.argv[1] source_dir = sys.argv[2] destination = sys.argv[3] # 校验水印文件是否存在 if not os.path.isfile(watermark): print(f"错误: 水印文件 {watermark} 不存在") sys.exit(1) watermark_pdfs(watermark, source_dir, destination)
3. 关键修复点说明
- 过滤无效条目:新增
os.path.isfile()判断,确保只处理真正的PDF文件,排除文件夹干扰。 - 规范路径拼接:用
os.path.join()拼接路径,避免因目标文件夹末尾无斜杠导致的outputtest.pdf这类无效路径。 - 完整页面处理:原代码只给最后一页加水印,修复后改为给所有页添加(若你只需要最后一页,可改回原逻辑)。
- 参数校验:新增参数数量和文件存在性校验,让脚本更健壮,出错时能给出明确提示。
- 函数封装:核心逻辑封装成函数,代码结构更清晰,后续维护更方便。
4. 使用示例
运行时需要传入三个参数:
python pdf_watermarker_v2.py ./my_watermark.pdf ./raw_pdfs ./processed_pdfs
- 第一个参数:水印PDF的路径
- 第二个参数:待处理PDF所在的源文件夹路径
- 第三个参数:处理后PDF要保存的目标文件夹路径
内容的提问来源于stack exchange,提问作者BLOEDLINK
相关产品推荐
相关产品推荐

