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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:47:35