PDF加水印
批量给 PDF 添加文字或图片水印,支持字体/字号/颜色/位置/角度/透明度自定义,中文水印自动安装系统字体,基于 pdfcpu 实现,支持右键选中 PDF 一键批量加水印、定时任务自动加水印、被其他脚本联动调用
脚本能力
基于 pdfcpu 批量给 PDF 添加文字 / 图片水印,支持位置 / 字体 / 字号 / 颜色 / 角度 / 透明度自定义,中文水印自动安装系统字体,生成副本不覆盖原文件。
📖 简介
本工具基于 pdfcpu,通过不忙脚本盒子自动生成的配置窗口设置水印样式,无需任何手写界面。配置完成后,在文件资源管理器中选中 PDF 文件,右键即可一键批量添加水印;也可设为定时任务自动执行,或被其他脚本联动调用。
✨ 核心特性
- 文字 + 图片双水印:一键切换文字水印或图片水印(PNG/JPG)
- 中文开箱即用:pdfcpu 核心字体不含中文字形,脚本检测到中文时自动从 Windows 系统字体目录安装宋体 / 黑体 / 楷体等,无需手动配置
- 一键批量:右键选中多个 PDF,全部自动添加水印
- 样式自定义:位置(上 / 下 / 左 / 右 / 居中)、字体、字号、颜色、边距、旋转角度均可调
- 斜向铺满:沿页面对角线斜跨整页的水印效果,经典水印样式
- 透明度可调:默认 30%,低透明度叠加在内容上方,不遮挡正文
- 生成副本:默认生成
_水印副本,绝不覆盖原文件(可切换为覆盖模式) - 右键菜单集成:选中 PDF → 右键 → 一键加水印
- 定时任务:在盒子里设定时间自动批量加水印,无人值守
- 脚本联动:可被其他脚本作为节点调用,返回处理结果
- 基于 pdfcpu:成熟 PDF 引擎,处理高效稳定
脚本演示

📦 安装方法
-
通过不忙脚本盒子安装(推荐)
-
下载并安装 不忙脚本盒子
-
打开不忙脚本盒子 → 脚本市场 → 搜索 「PDF加水印」
-
点击「安装」
-
✅ 推荐使用不忙脚本盒子安装、盒子会自动为脚本配置环境、依赖、并提供右键、快捷键、定时任务、脚本联动等能力
🚀 使用方式
通过不忙脚本盒子安装后,可通过以下方式使用「PDF加水印」功能:
-
一键添加水印(日常使用)
-
在文件管理器中选中一个或多个 PDF 文件
-
右键点击,选择「PDF加水印」
-
盒子自动弹出配置窗口,按需调整水印文字 / 字体 / 位置 / 透明度等(不调整则用上次的配置)
-
点击「执行」,脚本自动批量添加水印
-
-
定时任务
-
打开「不忙脚本盒子」→ 定时任务 → 新建任务
-
选择 「PDF加水印」,在表单里选定要处理的 PDF 文件与水印参数
-
设定执行时间(每天 / 每周 / 固定间隔等),到点自动运行、无人值守
-
-
脚本联动(节点)
-
其他脚本可通过盒子调用「PDF加水印」为 PDF 批量加水印
-
执行完成后返回
output_paths(成功文件列表)与failed_paths(失败文件列表)
-
-
快捷键操作
-
为脚本设置全局快捷键
-
选中 PDF 文件,按下快捷键即可快速添加水印
-
✅ 配置由盒子自动记忆上次填写的值,无需每次重复设置
🖥️ 环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10+(64位) |
| 运行环境 | python3.8, pdfcpu |
📝 说明
- 中文字体:需要中文水印时,脚本会自动安装系统字体(宋体/黑体/楷体/仿宋/微软雅黑/等线);若使用英文/数字水印也可选择 pdfcpu 核心字体(Helvetica 等)
- 图片水印:在配置窗口「水印类型 = 图片水印」时填写本地 PNG/JPG 图片的路径
- 斜向铺满与旋转角度互斥:勾选「斜向铺满」后水印沿对角线斜跨整页,关闭后可自定义旋转角度
- 定时任务 / 联动调用不弹配置窗口:按默认值或你预设的参数无人值守运行
节点脚本(开发者阅读)
本脚本声明了 [bmscriptsbox.node],可被其他脚本联动调用。调用时按 /api/link 传入 data.target_paths 与 params(缺省用 TOML 默认值),脚本无人值守执行并回传信封:
import json, sys, requests
payload = json.load(open(sys.argv[1], encoding="utf-8"))
api_base = payload["environment"]["api_base"]
target = payload["data"]["target_paths"][0]
r = requests.post(f"{api_base}/api/link", json={
"script_id": "7fb00902-812b-44ad-b45e-b923a01d5ce1",
"data": {"target_paths": [target]},
"params": {"text": "内部资料", "position": "c", "opacity": 0.3},
}, timeout=3600)
body = r.json()
if body.get("success") and body["result"].get("code") == 0:
output_paths = body["result"]["output_paths"] # 成功文件列表
failed_paths = body["result"]["failed_paths"] # 失败文件列表
返回业务键:
| 键 | 类型 | 说明 |
|---|---|---|
output_paths |
list | 加水印后生成/覆盖的 PDF 路径列表 |
failed_paths |
list | 处理失败的 PDF 路径列表 |
bm-scripts-box-rc.toml
[bmscriptsbox]
[bmscriptsbox.info]
id = "7fb00902-812b-44ad-b45e-b923a01d5ce1"
name = "PDF加水印"
desc = "批量给 PDF 添加文字或图片水印,支持字体/字号/颜色/位置/角度/透明度自定义,中文水印自动安装系统字体,基于 pdfcpu 实现,支持右键选中 PDF 一键批量加水印、定时任务自动加水印、被其他脚本联动调用"
version = "2.0.1"
icon = "./imgs/img.png"
[bmscriptsbox.runtime]
language = "python"
language_version = ">=3.8"
entry = "main.py"
terminal = "always"
binaries = [{name = "pdfcpu"}]
[bmscriptsbox.triggers.context_menu]
enabled = true
targets = ["files"]
filters = [".pdf"]
[bmscriptsbox.triggers.shortcut]
enabled = true
input_type = "active"
filters = [".pdf"]
[[bmscriptsbox.inputs]]
name = "target_paths"
label = "源文件"
type = "list"
pick = "files"
exts = [".pdf"]
description = "要添加水印的 PDF 文件"
[[bmscriptsbox.outputs]]
name = "output_paths"
type = "list"
description = "加水印后生成/覆盖的 PDF 路径列表"
[[bmscriptsbox.outputs]]
name = "failed_paths"
type = "list"
description = "处理失败的 PDF 路径列表"
[[bmscriptsbox.params]]
name = "wm_type"
label = "水印类型"
type = "str"
default = "text"
choices = ["text", "image"]
choice_labels = { text = "文字水印", image = "图片水印" }
description = "文字水印或图片水印"
[[bmscriptsbox.params]]
name = "text"
label = "水印文字"
type = "str"
default = "机密文件"
when = { field = "wm_type", eq = "text" }
description = "文字水印内容,支持中文(自动安装宋体/黑体等系统字体)"
[[bmscriptsbox.params]]
name = "font"
label = "字体"
type = "str"
default = "SimSun"
when = { field = "wm_type", eq = "text" }
choices = ["Helvetica", "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique", "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", "Symbol", "ZapfDingbats", "SimSun", "SimHei", "KaiTi", "FangSong", "Microsoft YaHei", "DengXian"]
choice_labels = { SimSun = "宋体 SimSun", SimHei = "黑体 SimHei", KaiTi = "楷体 KaiTi", FangSong = "仿宋 FangSong", "Microsoft YaHei" = "微软雅黑 Microsoft YaHei", DengXian = "等线 DengXian" }
description = "核心字体仅支持英文/数字;中文需选宋体/黑体等中文字体(自动安装)"
[[bmscriptsbox.params]]
name = "size"
label = "字号"
type = "int"
default = 36
when = { field = "wm_type", eq = "text" }
description = "文字字号(1-200)"
[[bmscriptsbox.params]]
name = "color"
label = "颜色"
type = "str"
default = "#666666"
when = { field = "wm_type", eq = "text" }
choices = ["#000000", "#333333", "#666666", "#999999", "#D32F2F", "#1E88E5", "#2E7D32", "#EF6C00"]
choice_labels = { "#000000" = "黑色", "#333333" = "深灰", "#666666" = "灰色(默认)", "#999999" = "浅灰", "#D32F2F" = "红色", "#1E88E5" = "蓝色", "#2E7D32" = "绿色", "#EF6C00" = "橙色" }
description = "水印颜色,支持预设色与任意 #RRGGBB"
[[bmscriptsbox.params]]
name = "position"
label = "位置"
type = "str"
default = "c"
choices = ["tl", "tc", "tr", "l", "c", "r", "bl", "bc", "br"]
choice_labels = { tl = "左上角", tc = "顶部居中", tr = "右上角", l = "左侧居中", c = "页面居中", r = "右侧居中", bl = "左下角", bc = "底部居中", br = "右下角" }
description = "水印在页面上的锚点位置"
[[bmscriptsbox.params]]
name = "diagonal"
label = "斜向铺满"
type = "bool"
default = true
description = "沿页面对角线斜跨整页(与旋转角度互斥)"
[[bmscriptsbox.params]]
name = "rotation"
label = "旋转角度"
type = "float"
default = 0.0
when = { field = "diagonal", eq = false }
description = "水印旋转角度(-180 ~ 180),斜向铺满关闭时生效"
[[bmscriptsbox.params]]
name = "opacity"
label = "透明度"
type = "float"
default = 0.3
description = "水印透明度(0-1,默认 0.3)"
[[bmscriptsbox.params]]
name = "margin"
label = "边距"
type = "int"
default = 0
description = "水印距页面边缘的距离(磅,0-200)"
[[bmscriptsbox.params]]
name = "image"
label = "图片路径"
type = "str"
default = ""
when = { field = "wm_type", eq = "image" }
description = "水印图片的本地路径(PNG / JPG)"
[[bmscriptsbox.params]]
name = "image_scale"
label = "图片缩放"
type = "float"
default = 0.5
when = { field = "wm_type", eq = "image" }
description = "水印图片相对页面宽度的缩放(0.05-1.0)"
[[bmscriptsbox.params]]
name = "mode"
label = "输出方式"
type = "str"
default = "copy"
choices = ["copy", "overwrite"]
choice_labels = { copy = "生成副本(推荐)", overwrite = "覆盖原文件" }
description = "生成副本不覆盖原文件;覆盖模式直接改写原文件"
[[bmscriptsbox.params]]
name = "suffix"
label = "副本后缀"
type = "str"
default = "_水印"
when = { field = "mode", eq = "copy" }
description = "生成副本模式下的输出后缀,如 `报告` 得到 `报告_水印.pdf`"
[bmscriptsbox.params_form]
enabled = true
[bmscriptsbox.schedule]
enabled = true
[bmscriptsbox.node]
enabled = true
免责声明
所有脚本由用户通过开源仓库自行发布。本站仅提供索引服务,"不忙脚本盒子"仅提供展示与安装服务。请在使用前仔细核实脚本内容,作者不对其安全性、准确性及适用性作任何保证。