SuperAPI AI 工具集

pdf-toolkit

办公与效率

查看项目

更新于 10-16 03:19

技能介绍

pdf-toolkit 是一个用于结构化 PDF 操作的技能,强调确定性和可编程性,适合在明确知道要完成什么操作时使用。它不提供自然语言式的原地改写,而是把 PDF 的变更步骤保持为确定性操作:先由模型推理草拟替换内容,再用显式的提取、生成、合并等操作产出最终 PDF。

用途与主要能力

该技能覆盖以下几类操作:

  1. 提取:从 PDF 中取出文本或表格,输出为 JSON,包含页数、元数据、逐页文本和表格数据。文本提取使用 pdfplumber,相比朴素提取能更好保留分栏布局;表格提取使用 pdfplumber.extract_tables() 的默认设置,遇到复杂布局可通过 --tables-strategy lines|text|explicit 切换检测模式。

  2. 合并:把多个 PDF 的页面合并为一个文件。既可以合并完整文件,也可以通过 manifest.json 指定每个文件要包含的页码范围。

  3. 拆分:按页码范围把一个 PDF 拆成多个输出文件,每个范围写一个文件,命名形如 output_dir/input_001.pdf、input_002.pdf 等。

  4. 表单填写:填写 PDF 中的 /Tx 表单字段。脚本通过 pypdf.PdfReader.get_fields() 发现字段,并用 update_page_form_field_values() 更新;JSON 中未出现的字段保持不变。可用 --list-fields 在不填写的情况下枚举表单字段。

  5. 从零生成:使用 reportlab 直接创建新 PDF,包括设置字体、绘制文本、分页保存。需要表格、页眉页脚、多栏布局时,可改用 reportlab.platypus(SimpleDocTemplate、Paragraph、Table、PageBreak)。

使用方式

技能提供内联 Python 示例,配合受限通道中的 execute_code 使用。文件应保留在当前工作区,完成后调用 publish_artifact 发布最终 PDF。文中给出的 shell 命令需要可用的 exec_command,属于可选快捷方式,并非请求宿主机执行的理由。如果沙箱或所需库不可用,应报告该限制,而不是在沙箱外重试。

各操作的调用形式:

  • 提取:python {baseDir}/scripts/extract.py /path/to/doc.pdf --json
  • 合并完整文件:python {baseDir}/scripts/merge.py a.pdf b.pdf c.pdf --out combined.pdf
  • 按清单合并:python {baseDir}/scripts/merge.py manifest.json --out combined.pdf
  • 拆分:python {baseDir}/scripts/split.py input.pdf --pages "1-3,7,10-12" --out output_dir/
  • 表单填写:python {baseDir}/scripts/form_fill.py form.pdf data.json --out filled.pdf

页码范围采用 1 起始、逗号分隔、连字符表示区间;省略 pages 表示包含整个文件。

生成新 PDF 的示例使用 reportlab.pdfgen.canvas 与 LETTER 页面尺寸,设置 Helvetica-Bold 与 Helvetica 字体绘制文本。中文文本需注册 CJK 字体,例如通过 reportlab.pdfbase.cidfonts.UnicodeCIDFont 注册 STSong-Light,再以该字体绘制中文。CID 字体依赖 PDF 阅读器的 CJK 支持;若需要嵌入字体,应使用工作区内已有或允许的系统字体根中的授权字体,并在发布前用 pypdf 校验文本。

适用场景

适合需要程序化、可重复的 PDF 处理任务,例如批量提取文档文本与表格、按指定页面组合报告、按范围拆分归档、填写固定表单模板,以及用数据生成新的 PDF 报告。

限制与注意事项

  • 该技能不包含 Tesseract,无法对扫描版 PDF 做 OCR;扫描图像 PDF 需要先经 OCR 才能走文本路径。
  • 加密 PDF 在此为只读,解密需要用户提供密码,不在本技能范围内。
  • PDF 转图片渲染需使用封装 Poppler 或 PyMuPDF 的独立技能。
  • 数字签名操作(签名、验证、吊销)不在范围内。
  • 表单填写仅支持 AcroForm;XFA 表单(部分法律模板使用)需要 Adobe 专用工具,超出范围。
  • /Btn 复选框字段取导出值(常为 Yes、On 或 1),而非 true,可用 --list-fields 查看。
  • 部分已签名 PDF 在字段变更后签名会失效,如有需要可用 --clear-signatures 显式清除签名。
  • 提取文本为空通常是因为扫描件没有文本层;提取出现乱码可能是 PDF 使用自定义字体编码,可尝试调整 pdfplumber 的 laparams 参数。
  • 合并后文件过大可能因底层 PDF 嵌入大字体,可用 pypdf 的 compress_content_streams() 做字体子集化。
  • 表单填写静默无效通常是 JSON 中的字段名与 PDF 字段名不匹配,应先运行 --list-fields 查看准确名称。
  • 拆分后页面顺序异常可能是范围重叠被意外合并,应使用互不重叠的范围,例如 1-3,4-6 而非 1-5,3-6。

对于“把标题改短”这类自然语言修改请求,应检查源页面、由模型草拟替换文本,再用审查后的内容生成新文档;不应声称支持任意原地页面改写。