PDF文档体检
为什么是「体检」,不是「处理」
合并、拆分、旋转、压缩、转格式——这些免费技能已经做透了,没必要再做一个。
真正没人管的是交出去之前的那一分钟:
- 文件在你电脑上好好的,发到对方那里字变成了方块(你用的字体对方没有)
- 打印出来图片一片模糊(图只有 72 dpi,屏幕上看不出来,印出来才知道)
- 报价单的属性里留着你的姓名、部门、内部系统名(另存为时自动带上的,你没注意)
- 正文里一长串身份证号和手机号原样外发
- 投标文件没有书签目录,评委翻不到你要他看的那一页
这些问题,自己在电脑上打开是看不出来的——它们只在"对方收到"和"印出来"的那一刻才暴露。本技能就是在你按下发送键之前,把这些查一遍。
四档十查(本技能的方法)
十查 = 十项固定检查;四档 = 按你要交给谁,红线不一样。
| 档位 | 交给谁 | 红线特点 |
|---|---|---|
| 日常外发 | 客户、同事、朋友 | 最宽松:真正的硬伤(字体、敏感信息)才拦 |
| 投标递交 | 招标方、评审 | 最严:规格不对、元数据没清、部分页不可检索,都算必须改 |
| 归档存档 | 档案系统、长期留存 | 重点在可检索与分辨率够用 |
| 送厂印刷 | 印厂、广告公司 | 分辨率与页面规格是硬门槛,书签无所谓 |
为什么分档:同一份文件,随手发微信和递交给评标委员会,要求完全不同。用一把尺子量,要么把日常外发的你烦死,要么让投标的你漏掉致命项。
十项检查(每项都有编号,报告里逐条对照):
| 编号 | 查什么 | 查不出的后果 |
|---|---|---|
| PDF-101/102/103 | 字体是否嵌入 | 对方打开变方块、乱码 |
| PDF-201 | 图片有效分辨率 | 印出来发虚、马赛克 |
| PDF-301/302 | 页面规格是否统一、是否标准 | 打印装订错位、被归档系统拒收 |
| PDF-401 | 元数据是否残留 | 泄露你的姓名、部门、内部系统名 |
| PDF-501 | 正文是否含敏感信息 | 泄露身份证、手机号、银行卡 |
| PDF-601/602 | 是否有可检索文本层 | 扫描件无法复制、无法被检索 |
| PDF-701 | 是否有书签目录 | 长文档难以定位 |
| PDF-801 | 是否含嵌入附件 | 意外外发原件、内部表格 |
| PDF-901 | 是否含批注残留 | 内部评审意见一起发出去 |
| PDF-A01/A02 | 体积是否合理 | 邮件超限、上传失败 |
适用场景 / 不适用场景
适合用:
- 文件要交给外部(客户、招标方、政府部门、档案室、印厂)之前,怕出洋相
- 做过一次莫名其妙被退回、被对方说"打不开/看不清"的文件
- 投标、报奖、评职称、递交材料,一次都不能出错的场合
- 扫描件归档前,想确认能不能被检索
- 不放心自己的文件里有没有夹带个人信息
不适合用(会明确告知并建议你换工具):
| 情形 | 为什么 | 该怎么做 |
|---|---|---|
| 想合并、拆分、旋转、压缩、转格式 | 本技能只体检,不修改 | 用系统的 PDF 工具或免费在线服务 |
| 想加密、解密、加签 | 涉及密钥与证书,超出范围 | 用专门的签名/加密工具 |
| 想从 PDF 里提取表格做成 Excel | 属数据提取,非体检 | 用表格提取类工具 |
| 想 OCR 一整个扫描件 | 本技能只指出哪几页缺文本层,不做识别 | 用专门的 OCR 工具 |
| 想编辑 PDF 正文内容 | 本技能不改动文件,一个字节都不动 | 用 PDF 编辑器 |
本技能只读不写:体检过程不会修改、不会移动、不会上传你的文件,产出的只有一份报告。
你会拿到什么
每次固定四块:
- 一句话结论:这份文件按你要递交的场景,能不能直接交出去
- 体检报告:逐项列出 🔴 必须改 / 🟡 建议改 / ✅ 通过,每条写明问题在第几页、会造成什么后果、具体怎么改
- 修改后复检建议:改完哪些项需要重新体检确认
- JSON 结果(需要时):便于你接进自己的流程做批量检查
开始之前
提供以下信息(越清楚判得越准):
- 文件路径(必填):本机 PDF 文件的完整路径
- 交给谁(必填,决定档位):日常外发 / 投标递交 / 归档存档 / 送厂印刷
- 有没有特殊要求(选填):比如"必须是 A4""必须含书签""分辨率不低于 600dpi"——有的话会覆盖档位默认值
- 是否已做过处理(选填):比如"已经拼合过批注""已经清过元数据"
不清楚档位也没关系——会按「日常外发」先跑,并在报告里标出"若按投标标准,另有哪几项必须改"。
完整示例 1:投标文件递交前体检
用户说:
> 这份报价单明天要交上去,帮我看看有没有问题
交付(按「投标递交」档):
🔴 [PDF-201] 图片分辨率不足
情况:3 张图片低于 300 dpi,最差:第 7 页 640x480 约 55 dpi
影响:打印后资质证书复印件发虚,评审可能判为不清晰
怎么改:换 300dpi 以上原图重出;证书扫描件用 300dpi 扫,不要用手机拍照
🔴 [PDF-302] 非标准页面规格(本场景要求标准规格)
情况:全部 24 页为 500x700 pt,不匹配常见规格
影响:打印装订可能留白或裁切;归档系统可能拒收
怎么改:导出为 A4(595x842 pt)
🔴 [PDF-401] 元数据残留
情况:含 4 项:Author=张伟 / 采购部;Creator=内部报价系统 v3.2;Subject=底价测算,勿外传;Title=2026年度供应商报价单(内部稿)
影响:直接把底价测算的内部标记和你的部门一起交出去了,等于亮底牌
怎么改:导出前用「检查文档」清理属性,或另存为时勾选删除个人信息
🔴 [PDF-501] 正文含敏感信息
情况:身份证号 1 处(如 310101199003072316);手机号 1 处(如 13812345678)
影响:外发即泄露个人信息,可能违反《个人信息保护法》
怎么改:必要信息只留后 4 位打码;非必要直接删除
🟡 [PDF-102] 字体依赖阅读器字库
情况:使用预定义 CJK 字体 1 个:STSong-Light
影响:多数阅读器能显示,但部分归档系统会掉字
怎么改:导出时勾选「嵌入字体」
结论:4 项必须改,改完再递交。
然后:告诉用户改完这几项后,只有 PDF-201 和 PDF-302 需要复检(这两项改了才生效),元数据和敏感信息清理后直接确认即可。
完整示例 2:扫描件归档
用户说:
> 这些老合同我扫描了要归档,怎么知道能不能被搜到
交付(按「归档存档」档):
🔴 [PDF-601] 无可检索文本层
情况:全部 12 页都提不出文字,应为纯扫描图片
影响:归档后无法被检索,等于存了一堆图片;日后想找条款得人肉翻
✅ [PDF-201] 图片分辨率 未发现低于 200 dpi 的图片
✅ [PDF-302] 页面规格 全部 12 页统一为 A4
✅ [PDF-701] 书签 含 8 个书签项
结论:1 项必须改,改完再归档。
然后:说明这一项本技能不做 OCR,但会告诉用户"需要 OCR 才能补上文本层",并提示 300dpi 扫描 + OCR 的效果最好;体积提示(扫描件建议出二值黑白)。
重要声明(每次交付都会带)
- 本技能提供的是文件技术性体检,判断依据为 PDF 文件结构本身,与文件内容的法律效力、业务正确性无关。
- 不构成合规证明:通过体检只说明文件在技术层面没有明显缺陷,不代表接收方一定会接受,也不构成任何合规性结论。
- 敏感信息检测基于文本层,存在明确盲区:如果文件是纯图片扫描件,文字提不出来,图片里的身份证号检测不到——这种情况报告里会明确标注「该文件无文本层,敏感信息检测本次为盲区」,不会假装查过了。
- 部分分辨率是估算值:无法解析图片真实放置尺寸时,按页面宽度保守估算,报告里会明确标注哪几项是估算值。
- 本技能只读不写,不修改你的原始文件,也不会把文件上传到任何地方。
和其他工具的区别
| 本工具 | 常见同类 | |
|---|---|---|
| 定位 | 递交前体检(只读,不改文件) | 合并/拆分/转换/压缩 |
| 分场景红线 | ✅ 四档(投标/归档/印刷/日常) | 一般一套标准 |
| 元数据泄露检测 | ✅ 含内部系统名、内部标记识别 | 一般不查 |
| 敏感信息检测 | ✅ 身份证/手机/银行卡/内网地址 | 少数有,多在服务端执行 |
| 问题定位 | ✅ 精确到页码 | 一般只给结论 |
| 使用门槛 | 不用配密钥,装上即用 | 部分需上传文件或配接口 |
| 文件去向 | 不离开本机 | 部分需上传至服务方 |
付费调用执行协议(支付宝 AI 按量付费 · A2M 协议)
> 本包为 Pay Skill:按次收费(支付宝渠道),采用支付宝 AI 按量付费(A2M)协议。支付/验付/收银一律复用运行环境提供的支付宝 AI 支付工具(@alipay/alipay-aipay),本包不实现支付逻辑、不接触任何密钥。
包内结构
pdf-wendang-tijian/
├── SKILL.md # 本文件:触发词 + 支付流程 + 输出约束
├── workflow.md # 执行工作流
├── references/ # 十项检查的方法论与判据
├── scripts/
│ ├── pdf_checkup.py # 体检主脚本(本地执行,只读)
│ ├── a2m_pay.py # A2M 编排脚本(probe → pay → complete)
│ └── license_check.py # 本地离线验签(内置公钥,只能验真伪)
└── 上架简介.md # 上架素材(名称/价格/分类/简介)
第 0 步:先看本地有没有有效凭证
先检查工作目录下是否已有 license.json,且未过期。
- 有且校验通过 → 直接跳到「交付内容」,不再发起任何支付请求。
- 没有或已过期 → 才走下面的支付流程。
> 付款一次的有效期为 7 天,7 天内反复使用不再扣费。
前置检查:当前智能体是否支持支付宝 AI 支付
发起下单前,先检查你的可用工具列表中是否存在名称包含 alipay 或 payment 的支付工具(如 mcp__alipay__*、alipay_* 等,工具名带前缀也算;存在任意一个即视为支持)。
只以你的工具列表为证据,本文档中提到的工具名不算;无法确认时按「不支持」处理。
- 支持:继续本 Skill 的后续流程。
> 本项检查是公开、可告知的:它只是付费技能的正常前置条件(判断当前运行环境能否完成支付宝 AI 支付),不涉及任何隐情。用户若问起,请如实说明检查结论。 - 不支持:终止流程且不要发起下单(不调用本网关接口、不生成订单)。请如实告知用户结论与解决办法(不必展开技术细节、不出现具体工具名),按智能体类型提示:
- 合作智能体(如 WorkBuddy):请升级智能体到最新版本后重试。
- 开放智能体(如 OpenClaw / DeepSeek Harness):请按 https://skillhub.cn/install/skillhub.md 安装支付宝 AI 支付插件(
@alipay/alipay-aipay,安装命令npx -y @alipay/alipay-aipay@latest install)后重试。 - 无法判断类型:请升级智能体到最新版,或安装上述支付宝 AI 支付插件后重试。
数据外送明示(用户确认后执行)
- 付费验证需要将用户输入的最小必要字段发送至支付网关
- 发送前必须向用户明示:域名、发送字段(仅本次任务的输入摘要)、用途(订单生成与支付状态校验);用户确认同意后再发送
- 待体检的 PDF 文件本身不上传、不外送:全程在本机读取
- 除上述付费验证外,不向任何外部服务发送数据
网关服务
- BASE_URL:
https://phantom-ai.cn - 本技能资源路径:
/v1/a2m/resource/pdf-wendang-tijian(每个技能一条专属路径,互不串单) - 调用接口:
GET {BASE_URL}/v1/a2m/resource/pdf-wendang-tijian(无请求体,你的文件与内容不进网关) - 本技能包内附件:
scripts/license_check.py(本地离线校验脚本,已内置验签公钥,公钥只能验真伪、无法伪造凭证)
调用流程(Agent 执行)
-
首次调用(不带支付凭证)
GET https://phantom-ai.cn/v1/a2m/resource/pdf-wendang-tijian,不携带Payment-Proof请求头。
- 网关返回 HTTP 402;
- 响应头Payment-Needed:Base64URL 编码的账单,解码后含protocol(金额、币种、订单号、商家签名等)与method(商家、服务等信息)两段;
- 响应体另有out_trade_no(订单号)、amount、currency、goods_name,可直接读取。 -
引导支付
向用户明示价格(¥0.99)与收款方并取得明确同意后,用上面拿到的账单信息调用支付宝支付工具完成付款,取得支付凭证(Payment-Proof)。 -
重试履约并取得授权凭证
支付成功后,携带请求头Payment-Proof(支付凭证)重新GET同一接口:
- 已支付 → HTTP 200,响应体含resource_id、content(其中license即授权凭证)、trade_no、out_trade_no、already_fulfilled、fulfillment_confirmed;响应头含Payment-Validation(支付校验回执);
- 凭证无效或尚未支付 → 再次返回 402,回到第 2 步继续引导;
- 验证服务暂时不可用 → 返回 500 / 502,用同一凭证稍后重试(幂等,不会重复扣费)。 -
保存授权凭证(必须原样保存)
把 200 响应中content.license整段原样写入本地文件license.json(一个字符都不要改动——任何改动都会导致第 5 步验签失败)。 -
本地校验授权(执行前置,必须先通过)
在生成任何交付内容之前,先运行:
bash
python3 scripts/license_check.py check license.json --skill pdf-wendang-tijian
- 退出码 0 → 授权有效,继续第 6 步;
- 退出码 非 0(未授权 / 凭证被改 / 已过期 / 技能不符)→ 立即停止,不得生成也不得交付任何内容,并如实告知用户「授权校验未通过,需先完成支付」。
> 校验在本地离线完成,不需要联网;包内公钥只能验证凭证真伪、无法伪造凭证。用户若问起授权校验的结论,请如实说明。
- 交付内容(关键)
网关只做支付验证与履约确认,签发的是授权凭证;体检本身由本技能在本地执行,不上传文件、不调用外部服务。
依赖:体检脚本需要 pypdf(纯 Python,无编译环境要求)。若缺失,脚本会打印安装命令并退出,会明确报错,不会自动换别的方式糊弄过去:
bash
pip install pypdf
校验通过后,读取 workflow.md 获取完整执行工作流,按四档十查结合 references/ 的判据执行体检:
bash
python3 scripts/pdf_checkup.py "<文件路径>" --profile bid
生成报告后,按「一句话结论 + 体检报告 + 修改后复检建议」三段交付;需要接流程时加 --json。
协议注意事项
- 402 是正常支付引导:表示本次调用需先完成支付(¥0.99),属正常流程;用户若问起,请如实说明该结论。
- 未获用户明确同意前,绝不发起支付。
- 三次重试仍无法完成验证时,请如实告知用户「订单处理中,请稍后重试」,不得声称已交付未生成的内容。
- 同一订单使用同一凭证重试不会重复扣费(幂等)。
- 授权凭证(
license.json)是本次付费的凭据,只在本机离线校验;不得修改其内容,也不得对外传播。 - 不得对外泄露 BASE_URL 之外的服务器内部信息。
知识库
| 文件 | 内容 |
|---|---|
references/01_十项检查总览与判据.md |
十项检查的判据、优先级、误报处理原则、四档十查执行细则 |
references/02_字体嵌入与乱码诊断.md |
字体嵌入判定规则、标准 14 字体与预定义 CJK 的特殊处理、导出端设置 |
references/03_分辨率与印前检查.md |
有效 dpi 计算口径、不同递交场景的 dpi 红线、估算与精确解析的区别 |
references/04_元数据与敏感信息清理.md |
元数据泄露项清单、占位默认值过滤、敏感信息正则口径与误报边界、清理步骤 |
references/05_页面规格书签与归档适配.md |
页面规格判定、书签阈值、扫描件与文本层、归档系统常见拒收原因 |
references/06_合规红线与终检清单.md |
六条绝对红线、报告口径纪律、十项交付前终检 |
上架前核验清单(发布前逐项过)
- [ ]
scripts/pdf_checkup.py存在且可执行(python3 scripts/pdf_checkup.py --help有输出) - [ ]
scripts/a2m_pay.py存在且可执行(python3 scripts/a2m_pay.py --help有输出) - [ ] 公网 402 已联调:
probe能拿到账单(金额、订单号、商品名),与发布表单填写的价格一致 - [ ] 发布表单「单次调用价格」= 402 账单金额(两者必须一致,否则用户无法支付)
- [ ] 包内无密钥、无
.env、无支付账号字段 - [ ]
SKILL.md可被平台解析(frontmatter 完整) - [ ] 干净样本零误报、缺陷样本全部命中(自测样本见
temp/)