title: “影刀RPA PDF水印添加:批量处理文档的完整方案”
date: 2026-07-01
author: 林焱
影刀RPA PDF水印添加:批量处理文档的完整方案
给外发的PDF加水印,防止文件被随意传播。报告、合同、资质文件都需要这个操作。一份两份手动加,几十份靠影刀批量处理,统一格式、省时省力。
什么情况用什么
必须加水印的场景:
外发给客户的报价单、方案书
涉密的财务报表
需要追踪谁泄露了文件(个性化水印,带收件人姓名)
内部流转文件,标注"机密"“仅供内部使用”
不需要的场景:
- 公开发布的文件,水印没意义
- 文件量极少,手动加更快
拼多多店群自动化报活动上架!
怎么做
方法1:用PyMuPDF添加文字水印(推荐)
PyMuPDF(fitz)性能最好,支持中文,操作直观。
【影刀操作】
添加【Python】指令(先安装)
importsubprocess subprocess.run(['pip','install','PyMuPDF'],capture_output=True)添加【Python】指令(给单个PDF加水印)
importfitz# PyMuPDFimportosdefadd_text_watermark(input_path,output_path,watermark_text,opacity=0.3,color=(0.5,0.5,0.5),font_size=60,rotation=45):""" 给PDF每一页添加对角线文字水印 opacity: 透明度 0-1 color: RGB颜色 (R, G, B) 每个值0-1 """doc=fitz.open(input_path)forpageindoc:page_width=page.rect.width page_height=page.rect.height# 在页面中间偏左、偏右各放一个水印positions=[(page_width*0.3,page_height*0.5),(page_width*0.7,page_height*0.3),]forx,yinpositions:# 插入文本水印page.insert_text((x,y),watermark_text,fontsize=font_size,color=color,rotate=rotation,overlay=False# 放在内容下面)doc.save(output_path,garbage=4,deflate=True)doc.close()print(f'已添加水印:{output_path}')# 单文件处理add_text_watermark(r'C:\原始PDF\报价单.pdf',r'C:\加水印PDF\报价单_水印.pdf','机密 · 仅供内部使用')添加【Python】指令(批量处理文件夹)
importfitzimportos input_dir=r'C:\原始PDF'output_dir=r'C:\加水印PDF'os.makedirs(output_dir,exist_ok=True)success_count=0fail_count=0forfilenameinos.listdir(input_dir):ifnotfilename.endswith('.pdf'):continueinput_path=os.path.join(input_dir,filename)output_path=os.path.join(output_dir,filename)try:add_text_watermark(input_path,output_path,'仅供内部使用')success_count+=1exceptExceptionase:print(f'处理失败:{filename},原因:{e}')fail_count+=1print(f'批量处理完成:成功{success_count}个,失败{fail_count}个')yda.set_variable('watermark_success',success_count)
方法2:个性化水印(带收件人信息)
给不同人发送不同水印,出现泄露时可以追踪来源。
【影刀操作】
- 添加【读取Excel】指令,读取收件人列表
- 添加【循环】指令,遍历收件人
- 在循环内添加【Python】指令
importfitzimportos recipient_name=current_recipient['name']recipient_email=current_recipient['email']# 个性化水印文字watermark_text=f'专属发送给:{recipient_name}\n{recipient_email}'input_path=r'C:\原始PDF\项目报告.pdf'output_path=f"C:\\个人水印PDF\\项目报告_{recipient_name}.pdf"doc=fitz.open(input_path)forpageindoc:# 右下角加小字标注page.insert_text((page.rect.width-200,page.rect.height-30),f'专属:{recipient_name}',fontsize=8,color=(0.7,0.7,0.7),overlay=True)# 中间对角线大水印page.insert_text((page.rect.width*0.2,page.rect.height*0.5),recipient_name,fontsize=70,color=(0.85,0.85,0.85),rotate=45,overlay=False)doc.save(output_path)doc.close()print(f'已生成:{recipient_name}的专属版本')
方法3:图片水印(logo水印)
品牌文件用公司logo做水印。
【影刀操作】
importfitzfromPILimportImageimportiodefadd_image_watermark(input_path,output_path,logo_path,opacity=0.3):"""在PDF每页右下角添加图片水印"""doc=fitz.open(input_path)# 读取logo并降低透明度logo=Image.open(logo_path).convert('RGBA')logo_w,logo_h=100,50# 水印尺寸logo=logo.resize((logo_w,logo_h))# 调整透明度r,g,b,a=logo.split()a=a.point(lambdax:x*opacity)logo=Image.merge('RGBA',(r,g,b,a))# 保存为字节流buf=io.BytesIO()logo.save(buf,format='PNG')logo_bytes=buf.getvalue()forpageindoc:pw=page.rect.width ph=page.rect.height# 右下角位置rect=fitz.Rect(pw-logo_w-20,ph-logo_h-20,pw-20,ph-20)page.insert_image(rect,stream=logo_bytes,overlay=True)doc.save(output_path)doc.close()有什么坑
坑1:中文水印乱码
PyMuPDF默认字体不支持中文,insert_text会显示方块。
解决方法:指定中文字体文件:
TEMU店群矩阵自动化运营核价报活动
page.insert_text((x,y),text,fontfile=r'C:\Windows\Fonts\simhei.ttf',fontsize=50)坑2:原PDF已有版权保护
加密的PDF,PyMuPDF打开时报错:PDF is encrypted。
解决方法:打开时提供密码:doc = fitz.open(path, password='xxx'),无密码的加密PDF无法直接处理。
坑3:水印挡住了内容
水印太深,把正文文字盖住了,影响阅读。
解决方法:调低 opacity(0.15-0.2最合适),或者用 overlay=False 把水印放在内容图层下面。
坑4:处理大PDF很慢
300页的PDF加水印要1-2分钟。
解决方法:多进程并行处理,用 multiprocessing.Pool 同时处理多个文件。
总结
PDF批量加水印首选PyMuPDF,性能好、API简洁。关键要解决中文字体问题,以及根据业务需求选择文字水印还是图片水印。个性化水印(带收件人名字)是防泄露追踪的好方法,外发重要文件时强烈推荐。