Featured image of post Skill 从入门到精通——第四章 Anthropic 官方Skill解析—pdf Skill 解析

Skill 从入门到精通——第四章 Anthropic 官方Skill解析—pdf Skill 解析

PDF Skill 是 Anthropic 官方 Agent Skills 体系中负责 PDF 全生命周期处理的专业技能。覆盖:读取解析、内容创建、文档操作、表单处理、格式转换、高级渲染。

Skill 从入门到精通——第四章 Anthropic 官方Skill解析—pdf Skill 解析

pdf Skill解析—PDF处理

一、技能概述

PDF Skill 是 Anthropic 官方 Agent Skills 体系中负责 PDF 全生命周期处理的专业技能。覆盖:

  • 读取解析: 文本/表格/元数据/图像提取。
  • 内容创建: 基于 reportlab 的 PDF 生成(含多页文档、表格、样式系统)。
  • 文档操作: 合并、拆分、旋转、裁剪、水印、加密。
  • 表单处理: 可填写表单(AcroForm)与非可填写表单(纯视觉表单)的自动填充。
  • 格式转换: PDF ↔ 图像、OCR 文本提取。
  • 高级渲染: 基于 PDFium 的高速渲染与浏览器端解析。

二、项目文件结构

基于./skills/skills/pdf目录源码,文件结构如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
pdf/
├── SKILL.md                           # 主编排提示词
├── reference.md                       # 高级功能与按需参考文档
├── forms.md                           # 专门的表单填写工作流指南
├── LICENSE.txt                        # 专有许可证
└── scripts/
    ├── check_fillable_fields.py       # 探测PDF 是否包含表单字段?
    ├── extract_form_field_info.py     # 提取原生可填写字段元数据
    ├── fill_fillable_fields.py        # 填写原生字段并验证
    ├── extract_form_structure.py      # 从不可填写 PDF 中提取文本/线条/复选框
    ├── check_bounding_boxes.py        # 填写前验证字段坐标
    ├── fill_pdf_form_with_annotations.py  # 为不可填写 PDF 添加 FreeText 注释
    ├── convert_pdf_to_images.py       # PDF → PNG,用于视觉分析
    └── create_validation_image.py     # 在图像上叠加边界框以进行视觉验证

职责分析:

  • SKILL.md:处理常见任务(合并、拆分、提取、创建、OCR、水印),并将表单填写委托给 forms.md
  • reference.md:补充 SKILL.md 未覆盖的高级特性、JS 生态、性能与故障排查。
  • forms.md:定义表单填写的多路径决策流程,强制规定步骤顺序。
  • scripts/ :是确定性的、单用途工具,将复杂工作流固化为可复用的 CLI 脚本。

设计模式: 渐进式披露,元数据(frontmatter)→ 核心指令(SKILL.md)→ 专业工作流(forms.md)→ 参考百科全书(reference.md)→ 可执行自动化(scripts/)。

三、核心决策树

PDF Skill 的执行逻辑基于输入参数触发决策分支,核心决策树如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
用户请求涉及 PDF
├─▶ 读取/提取
│   ├─ 纯文本 → pdftotext (poppler) / pdfplumber / pypdf
│   ├─ 表格 → pdfplumber (page.extract_tables)
│   ├─ 图片 → pdfimages (poppler) / pypdfium2 渲染
│   └─ 扫描件 → pdf2image → pytesseract OCR
├─▶ 文档操作(合并/拆分/旋转/加密)
│   ├─ Python 环境 → pypdf (PdfReader / PdfWriter)
│   └─ 命令行环境 → qpdf / pdftk
├─▶ 创建新 PDF
│   ├─ 简单绘图 → reportlab Canvas
│   └─ 复杂排版 → reportlab Platypus (SimpleDocTemplate)
├─▶ 表单填写(forms.md 强制流程)
│   ├─ Step 0: 检测是否有 fillable fields
│   │   └─ check_fillable_fields.py → get_fields() 判空
│   │
│   ├─▶ 有 fillable fields
│   │   ├─ extract_form_field_info.py → field_info.json
│   │   ├─ convert_pdf_to_images.py → 可视化分析
│   │   ├─ 人工构建 field_values.json
│   │   └─ fill_fillable_fields.py → 输出填充 PDF
│   │
│   └─▶ 无 fillable fields
│       ├─ Step 1: extract_form_structure.py → form_structure.json
│       ├─ 判断结构是否可用
│       │   ├─▶ 可用 → Approach A: 结构基坐标(pdf_width/pdf_height)
│       │   └─▶ 不可用 → Approach B: 视觉估算(image_width/image_height)
│       ├─ 可选: Hybrid(结构+视觉混合,需坐标转换)
│       ├─ Step 2: check_bounding_boxes.py 验证
│       ├─ Step 3: fill_pdf_form_with_annotations.py 填充
│       └─ Step 4: convert_pdf_to_images.py 验证输出
└─▶ 高级需求(渲染/JS 环境/优化)
    └─ reference.md → pypdfium2 / pdf-lib / pdfjs-dist / qpdf 高级特性

四、主要工作流

1、标准文本提取工作流
1
2
3
4
5
6
import pdfplumber

with pdfplumber.open("document.pdf") as pdf:
    for page in pdf.pages:
        text = page.extract_text()
        tables = page.extract_tables()

底层原理: pdfplumber 基于 pdfminer.six 解析 PDF 内容流。extract_tables() 默认采用 "lines" 策略,即通过显式线条划分单元格。

2、可填写表单工作流
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Step 1: 探测
python scripts/check_fillable_fields.py form.pdf
# → "This PDF has fillable form fields"

# Step 2: 提取字段元数据
python scripts/extract_form_field_info.py form.pdf field_info.json

# Step 3: 视觉确认(可选但推荐)
python scripts/convert_pdf_to_images.py form.pdf images/

# Step 4: 构造 field_values.json
# [{"field_id": "name", "page": 1, "value": "Smith"}, ...]

# Step 5: 填充并校验
python scripts/fill_fillable_fields.py form.pdf field_values.json filled.pdf
3、非可填写表单

两种方案选择:

Approach A:结构优先

extract_form_structure.py在 PDF 文件中检测到文本标签时,请使用此方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Step 1: 结构提取
python scripts/extract_form_structure.py form.pdf form_structure.json

# Step 2: 分析结构,计算字段坐标,构造 fields.json
# 使用 pdf_width / pdf_height 信号

# Step 3: 校验
python scripts/check_bounding_boxes.py fields.json

# Step 4: 填充
python scripts/fill_pdf_form_with_annotations.py form.pdf fields.json filled.pdf

# Step 5: 验证输出
python scripts/convert_pdf_to_images.py filled.pdf verify/

Approach B:视觉回退

当 PDF 为扫描件 / 图片格式,且结构提取未识别到可用文本标签时(例如所有文字均显示为「(cid:X)」类乱码),请使用此方式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Step 1: 转图像
python scripts/convert_pdf_to_images.py form.pdf images/

# Step 2: 粗略估算字段位置 → 裁剪局部区域(Zoom Refinement)
# magick page_1.png -crop 300x80+50+120 +repage crop.png

# Step 3: 精确标定像素坐标,构造 fields.json
# 使用 image_width / image_height 信号

# Step 4-6: 同 Approach A(校验 → 填充 → 验证)
4、性能优化工作流
场景 策略 工具
大文件拆分 流式处理,分 chunk(如每 10 页一组) PdfReader + 循环切片
大文件文本提取 避免全量加载,使用 pdftotext poppler-utils
图像提取 直接提取内嵌对象,避免渲染 pdfimages -all
Web 优化 线性化(流式下载) qpdf --linearize
损坏修复 结构检查 + 对象重建 qpdf --check / --fix-qdf

五、设计通用启示

1、渐进式披露

PDF Skill 不是单一大文档,而是 分层加载的知识图谱

  • 元数据层(YAML)→ 供 Agent 路由决策
  • 核心层(SKILL.md Body)→ 覆盖 80% 场景的快速解决路径
  • 专项层(forms.md / reference.md)→ 按需加载的深度知识
  • 工具层(scripts)→ 预置可执行代码,Agent 无需自行编写

启示: 在处理简单 PDF 任务时仅加载 SKILL.md,仅在触及表单填充或高级渲染时才拉取 forms.md / reference.md,实现上下文效率与能力深度的平衡。

2、防御性工程

源码中多处体现防御性设计:

  • Monkey Patch: 对上游库已知 bug 做运行时修复,而非等待版本更新
  • 校验脚本: check_bounding_boxes.py 在写入前拦截几何错误
  • 异常隔离: 批量处理中逐文件捕获异常,防止级联失败
  • 坐标双轨: 同时支持 PDF 坐标与图像坐标,并自动检测/转换
3、工程脚本化固化

forms.md 的核心设计是将认知工作流转化为可执行脚本

  • 人工判断(“是否有 fillable fields?")→ check_fillable_fields.py
  • 人工观察(“字段在什么位置?")→ extract_form_structure.py + convert_pdf_to_images.py
  • 人工计算(“坐标是否正确?")→ check_bounding_boxes.py
  • 人工验证(“填充后是否正确?")→ create_validation_image.py

这种设计将 LLM 的推理过程与工程执行解耦:LLM 处理模糊任务(从图像中识别字段用途、在方案 A/B 之间选择、解释验证错误)。边界清晰:

  • 自动化: JSON 提取、坐标转换、验证、PDF 写入
  • 人/LLM: 视觉分析、坐标细化、错误修正
4、文档即提示词

SKILL.md 和 forms.md 的结构是可执行的操作手册,而非被动文档。约束条件被强力标记:

  • 关键: 你必须按顺序完成这些步骤”
  • 重要: 切勿使用 Unicode 下标/上标字符”
  • 始终在填写前验证边界框

这充当了约束 LLM 在该 Skill 内行为的系统提示词。

5、显式状态优于隐式状态

该 Skill 始终将中间状态写入磁盘(field_info.jsonform_structure.jsonfields.json)。这带来了:

  • 可检查性和可调试性
  • 错误后的可恢复性
  • 无需重新生成一切即可进行人工覆盖

六、设计要点

  • 表单填写工作流是架构的核心: 它展示了如何通过组合确定性提取、LLM 视觉分析、显式 JSON 中间体和分层验证来处理高风险、多模态任务。

  • 显式中间状态(fields.jsonform_structure.json): 它将不透明的二进制格式转变为可检查、可修复的流水线。

  • 修改前快速失败验证: 三层填写前验证(结构性、模式性、语义性)确保坐标错误在产生损坏的 PDF 之前就被捕获。

  • 跨工具链的优雅降级:大多数操作都有 Python 和 CLI 替代方案,减少了环境脆弱性。

  • 文档即控制平面: Skill 文件中的强约束标记(“关键”、“重要”、“始终”)将文件转变为 LLM 的可靠系统提示词。

  • 运行时补丁修复库 bug 展示了务实的防御性编码——当依赖项存在影响真实世界 PDF 的已知 bug 时,Skill 会修补它而不是等待上游修复。

七、使用示例

示例1:解析pdf提取信息并创建新PDF

claude code中输入指令:

1
解析 ibm-1q-26-earnings-press-release.pdf  提取核心总结,并保存为新的pdf文件

生成结果如下:

image-20260424225733421

生成PDF文件ibm-1q-26-earnings-summary.pdf 如下:

image-20260424225621552

补充学习资源

如您想要系统建立 AI Agent 全栈开发能力,从概念认知到企业级项目落地、线上迭代优化,可以参考《栖微 AI Agent 工程师实战成长营》专栏。专栏以六阶成长路径组织内容,配套实战源码与持续更新的前沿案例,补齐 Demo 到生产环境之间的工程化短板。

更多介绍:《栖微 AI Agent 工程师实战成长营》

Github 项目 :https://github.com/tinyseeking/tidy-agent-practice

欢迎大家一起探讨智能体开发相关问题。

Licensed under CC BY-NC-SA 4.0