PDF 文字水印
为任意 PDF 文件添加半透明文字水印网格,输出为同名 _水印.pdf 副本。
默认参数
仅水印文字内容由用户每次指定,其余参数按以下默认值执行(用户明确修改时才调整):
| 参数 | 默认值 | 说明 |
|---|---|---|
| 字体 | 自动探测 | 默认自动探测系统中文字体(Windows 微软雅黑 / macOS PingFang / Linux Noto·文泉驿),找不到则回退 reportlab 内置 CID 中文字体(STSong-Light),无需额外安装 |
| 字号 | 15 pt | |
| 颜色 | 纯黑 RGB(0,0,0) | |
| 不透明度 | 15% | |
| 旋转角度 | 10° | 正=逆时针,负=顺时针 |
| 行数 | 10 | |
| 列数 | 10 | |
| 行间距 | 85 pt | 垂直于文字基线方向 |
| 列间距 | 文字宽度 + 45 pt | 沿文字基线方向,自适应避免重叠 |
| 溢出 | 允许 | 网格可向页面边缘外延伸,不强制限制在页面内 |
| 自动换行 | 文字 > 7 字时触发 | 每行最多 7 字、尽量均衡换行;含英文单词时优先按词换行,避免截断 |
| 位置 | 页面正中心 | 整体以页面中心为旋转轴心,行列对称居中 |
| 非 A4 预处理 | 默认开启 | 竖版非 A4 → 缩放至 A4 竖版;横版非 A4 → 缩放至 A4 横版。保持视觉方向,少量留白,/Rotate 一并烘焙为 0 |
| 输出命名 | 原文件名 + _水印 |
如 xxx.pdf → xxx_水印.pdf |
| 输出位置 | 与源文件同目录 | 不移动原文件 |
工作流程
- 确认源 PDF 文件路径存在
- 确认 Python venv 依赖(pypdf、reportlab)已安装,未安装则安装
- 执行
scripts/add_watermark.py,传入源文件路径和水印文字 - 用户仅指定文字内容时,其余参数全部使用默认值
- 用户明确修改某参数时,通过命令行选项传入修改值
- 完成后用 pymupdf 渲染预览图,确认水印效果
命令行用法
C:/Users/PC/.workbuddy/binaries/python/envs/default/Scripts/python.exe \
scripts/add_watermark.py <源PDF路径> <水印文字> [选项]
选项(均可省略,使用默认值):
| 选项 | 对应参数 | 默认值 |
|---|---|---|
--font-size |
字号 | 15 |
--rotation |
旋转角度 | 10 |
--opacity |
不透明度 | 0.15 |
--lines |
行数 | 10 |
--cols |
列数 | 10 |
--line-spacing |
行间距 | 85 |
--col-gap |
列间额外间距 | 45 |
--wrap-len |
自动换行阈值(字数) | 7 |
--no-preprocess |
禁用非 A4 预处理 | 不启用 |
--margin |
预处理留白比例(相对 A4 短边) | 0.03 |
--font |
字体文件路径(可选) | 自动探测系统中文字体;指定不存在时回退内置 CID 字体 |
/Rotate 自动补偿机制
PDF 文件可能包含 /Rotate 属性(0/90/180/270),导致物理坐标系与视觉方向不一致。脚本自动读取每页 /Rotate 值,计算 effective_rotation = 用户设定旋转 + 页面/Rotate,确保水印始终按用户期望的视觉方向呈现——无论 PDF 内部标记为横版还是竖版,效果统一。
对于非 A4 页面,预处理会先通过单一 CTM 把 /Rotate 烘焙进内容并将页面缩放到 A4,此时 /Rotate 已置 0,水印仅按用户设定角度倾斜即可。
批量处理
对同一批文档需保持水印一致时,逐个调用脚本(仅换文字内容),其余参数不变。若用户要求调整全局参数(如旋转角度),需对已生成的所有文件重新执行一遍。
注意事项
- 原文件不修改,始终输出副本
- 输出文件被其他程序打开时可能写入失败,此时使用临时文件名(如
_水印2),提示用户关闭后再改名 - reportlab 5.0+ 的
from reportlab.pdfbase.ttfonts import TTFont不可用,须用import reportlab.pdfbase.ttfonts as ttfonts; ttfonts.TTFont(...)方式访问 - msyh.ttc 是 TTC 集合字体,注册时须指定
subfontIndex=0