wechat-robot-skills/skills/pdf/references/editing.md
2026-09-09 12:30:35 +08:00

3.1 KiB
Raw Blame History

表单、裁剪、元数据和嵌入图片

通过 execute_skill_script 调用 scripts/edit_pdf.py。所有输出遵循 /usr/local/src/pdf/;不覆盖源文件。原有合并、拆分、旋转仍用 manage_pdf.py。

表单

先查看真实字段:

form-info --input '/usr/local/src/pdf/tmp/task/form.pdf'

返回字段 id、类型、当前值、只读状态、选择项和按钮状态。默认 50 项,--offset/--limit(最高 200)支持继续。没有 AcroForm 字段的扫描表单不能直接套用字段填写;XFA 和数字签名不是本接口支持的填写类型。

填写明确要求的字段:

form-fill --input '/usr/local/src/pdf/tmp/task/form.pdf' --output '/usr/local/src/pdf/filled.pdf' --data '{"name":"Alice","agree":true,"country":"CN"}'

较长数据用 --data-file <JSON> 替代 --data,二选一,上限 2 MiB、500 个字段。

  • 文本值必须是字符串,遵守字段长度。复选框可用 JSON true/false,或实际状态名如 /Yes;不能把非空字符串一律当作选中。
  • 单选按钮使用实际状态值;下拉/列表使用真实选项值,多选需原字段支持。无效值、未知字段、只读字段或签名字段明确失败。
  • pypdf 更新字段值与外观,再回读校验。必须渲染核对文字位置、换行、复选框和单选按钮状态。原表单字体未包含中文等字形时,不能仅凭字段值正确就交付;需保留可显示的模板或按用户要求重建表单版式。
  • 不把填写文本当作签署数字签名,也不主动提交表单。

裁剪

crop --input '/usr/local/src/pdf/tmp/task/source.pdf' --output '/usr/local/src/pdf/cropped.pdf' --pages '1-2' --box '20,30,575,812'

坐标单位 pt,按未旋转 PDF 坐标系的左、下、右、上填写;框必须在页面 MediaBox 内。省略 --pages 处理全部页。修改 CropBox,保留页面内容。裁剪不删除不可见内容,不是脱敏。 敏感信息移除需专门的真正删改流程,不能用白块或裁剪冒充。

元数据

读取用 inspect_pdf.py。更新明确字段:

metadata --input '/usr/local/src/pdf/tmp/task/source.pdf' --output '/usr/local/src/pdf/updated.pdf' --data '{"Title":"报告","Author":"机构"}'

支持 Title/Author/Subject/Keywords/Creator/Producer;保留未指定字段。该接口修改文档信息字典,现有 XMP 保留且通过 xmp_preserved 提示,不能声称已清理所有元数据。

嵌入图片

extract-images --input '/usr/local/src/pdf/tmp/task/source.pdf' --pages '2-3' --output-dir '/usr/local/src/pdf/tmp/task/images'

一次最多 4 页、默认 20 张图片(--max-images 最高 50),本批总大小不超过 25 MiB。用 remaining_pages 和 --start-image <next_image> 续读。需要覆盖本任务旧输出时加 --overwrite。

此操作提取 PDF 中的图像对象,不代表完整页面:不包含周围文字、矢量图形,也可能是被裁剪/复用的图片。阅读扫描页和视觉复核应使用 OCR 内部渲染或 render_pdf.py,不能把提取出的零散图片当成原 PDF 页。