Skip to content

Claude 官方 PDF Skill 深度解析

核心功能概览

Claude 官方 PDF Skill 是一个全面的 PDF 文档处理工具包,覆盖了 PDF 处理的完整生命周期:从文本提取、表格解析,到创建新文档、合并拆分、表单填写等。

+-------------------------------------------------------------------------+
|                     PDF Skill 核心功能矩阵                               |
+-------------------------------------------------------------------------+
|                                                                         |
|   +-------------+    +-------------+    +-------------+                 |
|   |  1. 读取    |    |  2. 提取    |    |  3. 创建    |                 |
|   |   PDF       |    |  文本/表格  |    |   新 PDF    |                 |
|   |  (pypdf)    |    | (pdfplumber)|    | (reportlab) |                 |
|   +-------------+    +-------------+    +-------------+                 |
|                                                                         |
|   +-------------+    +-------------+    +-------------+                 |
|   |  4. 合并    |    |  5. 拆分    |    |  6. 表单    |                 |
|   |   PDF       |    |   PDF       |    |   填写      |                 |
|   |  (pypdf)    |    |  (qpdf)     |    | (pdf-lib)   |                 |
|   +-------------+    +-------------+    +-------------+                 |
|                                                                         |
|   +-------------+    +-------------+    +-------------+                 |
|   |  7. OCR     |    |  8. 水印    |    |  9. 加密    |                 |
|   |  扫描件     |    |   添加      |    |   保护      |                 |
|   |(pytesseract)|    |  (pypdf)    |    |  (pypdf)    |                 |
|   +-------------+    +-------------+    +-------------+                 |
|                                                                         |
+-------------------------------------------------------------------------+

功能定位

维度说明
目标程序化处理、生成、分析 PDF 文档
核心能力文本提取、表格解析、合并拆分、表单填写、OCR
技术栈Python (pypdf, pdfplumber, reportlab) + JavaScript (pdf-lib) + CLI (qpdf, poppler)
适用场景批量文档处理、表单自动化、数据提取、报告生成

技术栈分工详解

PDF Skill 采用多工具协作的策略,根据不同任务选择最佳工具:

+-------------------------------------------------------------------------+
|                        PDF 处理技术栈选择指南                            |
+-------------------------------------------------------------------------+
|                                                                         |
|  任务类型                最佳工具              原因                      |
|  ─────────────────────────────────────────────────────────              |
|  基础读写/合并/拆分     pypdf (Python)       轻量、纯 Python、无依赖     |
|  文本提取(带布局)     pdfplumber           保留空间布局、精确坐标      |
|  表格提取               pdfplumber           专业表格识别算法            |
|  创建新 PDF             reportlab            强大的排版引擎              |
|  表单填写               pdf-lib (JS)         最佳表单结构保持            |
|  命令行批处理           qpdf / poppler       高性能、可脚本化            |
|  扫描件 OCR             pytesseract          Google OCR 引擎             |
|  PDF 渲染为图片         pypdfium2            Chrome 内核、高质量渲染     |
|                                                                         |
+-------------------------------------------------------------------------+

为什么需要这么多工具?

工具优势劣势最佳用途
pypdf纯 Python、轻量文本提取质量一般合并、拆分、旋转、加密
pdfplumber精确的文本/表格提取只能读取不能写入数据提取、文档分析
reportlab功能强大的 PDF 生成学习曲线陡峭创建复杂报告
pdf-lib完美保持表单结构需要 Node.js表单填写
qpdf高性能命令行工具需要系统安装批量处理、修复损坏 PDF
pypdfium2Chrome 级渲染质量功能专一PDF 转图片

主要使用场景

场景 1:从 PDF 提取数据

用户需求:"帮我从这份 100 页的年报 PDF 中提取所有财务表格"

Claude 执行流程

收到 PDF 文件
      |
      v
+---------------------------+
| 使用 pdfplumber 打开文档   |
+---------------------------+
      |
      v
遍历每一页,提取表格
      |
      v
+---------------------------+
| page.extract_tables()     |
| 返回二维数组表示表格内容   |
+---------------------------+
      |
      v
转换为 pandas DataFrame
      |
      v
导出为 Excel 文件

代码示例

python
import pdfplumber
import pandas as pd

with pdfplumber.open("annual_report.pdf") as pdf:
    all_tables = []
    for i, page in enumerate(pdf.pages):
        tables = page.extract_tables()
        for table in tables:
            if table:  # 确保表格非空
                df = pd.DataFrame(table[1:], columns=table[0])
                df['source_page'] = i + 1  # 记录来源页码
                all_tables.append(df)

    # 合并所有表格
    if all_tables:
        combined = pd.concat(all_tables, ignore_index=True)
        combined.to_excel("extracted_tables.xlsx", index=False)

场景 2:批量合并 PDF 文件

用户需求:"把这个文件夹里的 50 个 PDF 合并成一个文件"

代码示例

python
from pypdf import PdfWriter, PdfReader
import glob

writer = PdfWriter()

# 按文件名排序后合并
pdf_files = sorted(glob.glob("documents/*.pdf"))

for pdf_file in pdf_files:
    reader = PdfReader(pdf_file)
    for page in reader.pages:
        writer.add_page(page)

with open("merged_output.pdf", "wb") as output:
    writer.write(output)

print(f"已合并 {len(pdf_files)} 个文件")

场景 3:填写 PDF 表单

这是 PDF Skill 中最复杂但也最实用的功能。Skill 提供了完整的表单填写工作流:

+-------------------------------------------------------------------------+
|                       PDF 表单填写工作流                                 |
+-------------------------------------------------------------------------+
|                                                                         |
|   Step 1: 检查表单类型                                                  |
|   ─────────────────────                                                 |
|   python scripts/check_fillable_fields.py <file.pdf>                    |
|                                                                         |
|         |                                   |                           |
|         v                                   v                           |
|   +----------------+               +------------------+                 |
|   | 可填写表单字段 |               | 不可填写(扫描件)|                 |
|   +----------------+               +------------------+                 |
|         |                                   |                           |
|         v                                   v                           |
|   Step 2A: 提取字段信息             Step 2B: 图像分析                   |
|   extract_form_field_info.py        convert_pdf_to_images.py            |
|         |                                   |                           |
|         v                                   v                           |
|   Step 3A: 创建 field_values.json   Step 3B: 创建 fields.json           |
|   映射字段ID到填写值                 定义边界框和文本位置                 |
|         |                                   |                           |
|         v                                   v                           |
|   Step 4A: 填写表单                 Step 4B: 添加文本注释                |
|   fill_fillable_fields.py           fill_pdf_form_with_annotations.py   |
|         |                                   |                           |
|         v                                   v                           |
|   +------------------------------------------+                          |
|   |            输出:填写完成的 PDF           |                          |
|   +------------------------------------------+                          |
|                                                                         |
+-------------------------------------------------------------------------+

可填写表单的处理

python
# field_values.json 示例
[
  {
    "field_id": "last_name",
    "description": "用户姓氏",
    "page": 1,
    "value": "张三"
  },
  {
    "field_id": "checkbox_agree",
    "description": "同意条款复选框",
    "page": 1,
    "value": "/On"  # 使用 checked_value 来勾选
  }
]

不可填写表单(扫描件)的处理

需要通过图像分析确定文字位置,然后添加文本注释

python
# fields.json 示例
{
  "pages": [
    {"page_number": 1, "image_width": 612, "image_height": 792}
  ],
  "form_fields": [
    {
      "page_number": 1,
      "description": "姓名输入区域",
      "field_label": "姓名:",
      "label_bounding_box": [30, 125, 70, 142],
      "entry_bounding_box": [75, 125, 280, 142],
      "entry_text": {
        "text": "张三",
        "font_size": 14,
        "font_color": "000000"
      }
    }
  ]
}

场景 4:处理扫描件 PDF(OCR)

用户需求:"这是一份扫描的合同,帮我提取里面的文字"

python
import pytesseract
from pdf2image import convert_from_path

# PDF 转图片
images = convert_from_path('scanned_contract.pdf', dpi=300)

# OCR 识别每一页
full_text = ""
for i, image in enumerate(images):
    page_text = pytesseract.image_to_string(image, lang='chi_sim+eng')
    full_text += f"\n=== 第 {i+1} 页 ===\n{page_text}"

print(full_text)

场景 5:创建专业报告 PDF

用户需求:"帮我生成一份带表格和图表的销售报告"

python
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4

doc = SimpleDocTemplate("sales_report.pdf", pagesize=A4)
styles = getSampleStyleSheet()
elements = []

# 标题
elements.append(Paragraph("2024 年度销售报告", styles['Title']))
elements.append(Spacer(1, 20))

# 表格数据
data = [
    ['产品', 'Q1', 'Q2', 'Q3', 'Q4', '合计'],
    ['产品A', '120', '135', '142', '158', '555'],
    ['产品B', '85', '92', '98', '105', '380'],
    ['产品C', '200', '215', '230', '245', '890'],
]

# 创建表格并添加样式
table = Table(data)
table.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.darkblue),
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
    ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
    ('FONTSIZE', (0, 0), (-1, 0), 12),
    ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
    ('BACKGROUND', (0, 1), (-1, -1), colors.beige),
    ('GRID', (0, 0), (-1, -1), 1, colors.black),
]))
elements.append(table)

doc.build(elements)

命令行工具速查

poppler-utils

bash
# 提取文本
pdftotext input.pdf output.txt

# 保留布局提取文本
pdftotext -layout input.pdf output.txt

# 提取特定页面(第1-5页)
pdftotext -f 1 -l 5 input.pdf output.txt

# PDF 转图片(PNG,300 DPI)
pdftoppm -png -r 300 input.pdf output_prefix

# 提取 PDF 中的所有图片
pdfimages -j input.pdf images/img

qpdf

bash
# 合并 PDF
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf

# 拆分 PDF(每3页一个文件)
qpdf --split-pages=3 input.pdf output_%02d.pdf

# 提取特定页面
qpdf input.pdf --pages . 1-5,10,15-end -- extracted.pdf

# 旋转页面(第1页顺时针90度)
qpdf input.pdf output.pdf --rotate=+90:1

# 移除密码保护
qpdf --password=secret --decrypt encrypted.pdf decrypted.pdf

# 修复损坏的 PDF
qpdf --check damaged.pdf
qpdf --replace-input damaged.pdf

工具选择快速指南

你想做什么推荐工具关键代码/命令
合并 PDFpypdfwriter.add_page(page)
拆分 PDFqpdfqpdf --split-pages
提取文本pdfplumberpage.extract_text()
提取表格pdfplumberpage.extract_tables()
创建 PDFreportlabSimpleDocTemplate
填写表单pdf-lib / pypdf见 forms.md 工作流
OCR 扫描件pytesseract先转图片再 OCR
PDF 转图片pypdfium2page.render()
添加水印pypdfpage.merge_page(watermark)
加密保护pypdfwriter.encrypt(password)
批量处理qpdf命令行脚本

性能优化建议

+-------------------------------------------------------------------------+
|                         PDF 处理性能优化                                 |
+-------------------------------------------------------------------------+
|                                                                         |
|  1. 大文件处理                                                          |
|     - 使用流式处理,避免一次性加载全部内容                               |
|     - 用 qpdf --split-pages 先拆分再处理                                |
|     - 分块处理,每次只加载 10-20 页                                      |
|                                                                         |
|  2. 文本提取优化                                                        |
|     - 纯文本提取用 pdftotext(最快)                                     |
|     - 需要结构化数据时用 pdfplumber                                      |
|     - 避免在大文档上使用 pypdf.extract_text()                           |
|                                                                         |
|  3. 图片提取优化                                                        |
|     - 用 pdfimages 直接提取(比渲染页面快很多)                          |
|     - 预览用低分辨率,最终输出用高分辨率                                 |
|                                                                         |
|  4. 内存管理                                                            |
|     - 处理完每页后释放资源                                               |
|     - 使用 with 语句确保文件正确关闭                                     |
|     - 大批量处理时分批次执行                                             |
|                                                                         |
+-------------------------------------------------------------------------+

常见问题处理

加密 PDF 处理

python
from pypdf import PdfReader

reader = PdfReader("encrypted.pdf")
if reader.is_encrypted:
    reader.decrypt("password")

# 现在可以正常读取
text = reader.pages[0].extract_text()

损坏 PDF 修复

bash
# 检查 PDF 结构
qpdf --check damaged.pdf

# 尝试修复
qpdf --replace-input damaged.pdf

文本提取失败的后备方案

python
def extract_text_with_fallback(pdf_path):
    """优先使用 pdfplumber,失败则回退到 OCR"""
    try:
        import pdfplumber
        with pdfplumber.open(pdf_path) as pdf:
            text = "\n".join(page.extract_text() or "" for page in pdf.pages)
            if text.strip():
                return text
    except Exception:
        pass

    # 回退到 OCR
    import pytesseract
    from pdf2image import convert_from_path

    images = convert_from_path(pdf_path)
    return "\n".join(pytesseract.image_to_string(img) for img in images)

与其他 Skill 的对比

对比维度DOCX SkillPDF Skill
文件格式Word 文档(可编辑)PDF(固定布局)
核心挑战XML 结构操作固定布局数据提取
表单处理相对简单复杂(可填写/不可填写两种)
技术栈docx-js + Python6+ 工具协作
OCR 需求几乎不需要扫描件必需
输出保真度可能丢失格式精确保持布局

总结

PDF Skill 的核心价值在于提供了一个完整的 PDF 处理工具箱,覆盖了从数据提取到文档生成的全流程:

  1. 多工具协作:不同任务使用最适合的工具
  2. 表单填写完整方案:同时支持可填写和扫描件表单
  3. 性能优化指导:针对大文件和批量处理的优化建议
  4. 错误处理机制:加密、损坏、OCR 失败的处理方案
+-------------------------------------------------------------------------+
|                        PDF Skill 核心价值                                |
+-------------------------------------------------------------------------+
|                                                                         |
|   "PDF 处理的核心挑战在于 PDF 是一种'最终输出格式',                      |
|    它的设计目标是精确显示而非便于编辑。                                   |
|    PDF Skill 通过组合多个专业工具,                                      |
|    让 Claude 能够高效地处理这种'不友好'的文件格式。"                      |
|                                                                         |
+-------------------------------------------------------------------------+

基于 MIT 许可证发布。内容版权归作者所有。