定时PDF水印移除技能
1. 技能简介
本技能实现全自动、定时批量移除 PDF 文件中的图片类水印(含文字水印、Logo、背景浮水印)。它既支持调用第三方专业去水印软件(如 PDF Watermark Remover Pro)的 CLI 接口,也内置了基于 PyMuPDF 的开源备用方案——通过矩形遮罩或高斯模糊覆盖固定位置水印。通过结合系统定时任务(cron / 任务计划程序),实现“无人值守、即放即清”的高效文档预处理流水线。
2. 适用场景
- 财务结算:每日凌晨自动清理数百份财报上的“内部预览”水印,归档至共享盘。
- 设计交付:每周定时去除设计稿样机中的品牌占位水印,准备最终交付包。
- 法律档案:定期扫描并清理合同扫描件中自动添加的机构名称水印,保持档案整洁。
3. 输入参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
source_folder |
String | 是 | - | 存放待处理 PDF 的监控文件夹路径(如 D:\ToRemove)。 |
output_folder |
String | 是 | - | 处理完成后输出干净 PDF 的目标文件夹(如 D:\Cleaned)。 |
watermark_rect |
String | 是 | [0,0,100,100] |
水印所在矩形区域(单位:点,PDF坐标系,左下角为原点),格式 [x0, y0, x1, y1]。 |
cover_method |
Enum | 否 | white_rect |
覆盖方式:white_rect(白色遮罩)/ blur(高斯模糊)/ external_tool(调用外部专业软件)。 |
external_tool_path |
String | 否 | - | 若 cover_method 为 external_tool,需指定第三方 CLI 工具的完整路径。 |
schedule_time |
String | 是 | "02:00" |
每日定时执行时间(24小时制,如 "02:00" 表示凌晨2点)。 |
file_pattern |
String | 否 | *.pdf |
匹配文件名的通配符。 |
backup_enabled |
Boolean | 否 | true |
是否在处理前将原文件备份至 source_folder/backup/。 |
4. 输出规范
- 执行日志:在
output_folder下生成removal_log_{date}.txt,记录每个文件的处理状态(成功/失败/跳过)。 - 处理结果:所有去水印后的 PDF 按原文件名保存至
output_folder(若重名则自动添加_cleaned后缀)。 - 错误报告:若文件损坏或无法处理,会在日志中标记异常,并单独移入
output_folder/errors/。
5. 核心执行流程(工作流)
graph TD
A[定时触发器唤醒] --> B[扫描源文件夹]
B --> C{是否有匹配的PDF?}
C -->|否| D[记录空跑日志并退出]
C -->|是| E[启用备份机制(可选)]
E --> F[遍历PDF列表]
F --> G{选择去水印方式}
G -->|外部工具| H[调用CLI命令批量处理]
G -->|内置遮罩| I[执行PyMuPDF矩形覆盖]
H --> J[校验输出文件完整性]
I --> J
J --> K{校验通过?}
K -->|是| L[移动至输出目录并记录成功]
K -->|否| M[移入错误目录并记录失败]
L --> N{还有剩余文件?}
M --> N
N -->|是| F
N -->|否| O[发送邮件/通知汇总报告]
## 支付宝付费改造契约(PAYSKILL)
本技能为付费技能(PAYSKILL)。调用遵循支付宝 AI 生意画像契约,由平台调度层执行 `probe` → `pay` → `complete` → `ack` 流程:
1. **probe(探测)**:平台调用前先探测是否已持有本技能的支付宝有效订阅 / 付费凭证。已付费则直接放行。
2. **402 Payment-Needed**:未付费时,脚本向标准输出返回 HTTP 状态 `402` 与 `Payment-Needed` 标记,提示用户通过**支付宝**完成付费(`pay`),平台据此唤起付费页。
3. **complete(扣费确认)**:用户在支付宝完成扣费后,平台下发 `Payment-Proof`(付费凭证)。
4. **ack(验签放行)**:平台携带 `Payment-Proof` 重试本次调用;`scripts/payment_gate.py` 验签该凭证,确认有效后放行主流程。
**订阅持久化与幂等:**
- 付费状态缓存在本地 `.pay_cache/state.json`,避免每次调用重复付费(订阅持久化)。
- 同一 `Payment-Proof` 在 **24h 幂等窗口**内仅生效一次,避免重复扣费。
**现金流改造后的调用套路:**
```text
用户调用 → 平台 probe →
未付费:下发 402 Payment-Needed → 支付宝 pay → complete → 下发 Payment-Proof
已付费/携带 Proof:脚本 ack 验签 → 放行主流程
> 本契约由 SkillHUB 平台调度层解析,脚本本地仅处理 402 / 验签 / 持久化 三环节;付费本体交给支付宝。
支付宝 AI 按量付费(Machine Pay / A2M)改造说明
本 Skill 已按支付宝官方 A2M 协议改造为 Pay Skill,付费闸口位于 scripts/payment_gate.py,统一调用云端计费服务 https://pay.pembroli.cn/api/resource。
付费流程
- 未付费调用时,服务端返回 HTTP 402 +
Payment-Needed头,携带金额、商户、订单号及 RSA2 签名。 - 买家侧
payment_gate.py收到 402 后引导用户完成支付,平台回传Payment-Proof。 - 客户端携带
Payment-Proof重试资源端点。
验付调用
服务端收到 Payment-Proof 后,调用支付宝验付接口(alipay.aipay.agent.payment.verify)核验凭证有效性(trade_no、out_trade_no、active 状态),验证失败返回 400,验证通过才进入资源发放。
履约确认
资源发放成功后,服务端异步调用履约确认接口(alipay.aipay.agent.fulfillment.confirm,trade_no)回执,标记本笔订单已履约;并按 out_trade_no 做幂等,重复请求直接返回已缓存结果,杜绝重复收费。
幂等与缓存
买家侧按 slug 本地缓存 Payment-Proof(24h TTL),有效期内免重复支付;服务端按订单号幂等,保证同一笔订单只履约一次。
```