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 |
| pypdfium2 | Chrome 级渲染质量 | 功能专一 | 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/imgqpdf
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工具选择快速指南
| 你想做什么 | 推荐工具 | 关键代码/命令 |
|---|---|---|
| 合并 PDF | pypdf | writer.add_page(page) |
| 拆分 PDF | qpdf | qpdf --split-pages |
| 提取文本 | pdfplumber | page.extract_text() |
| 提取表格 | pdfplumber | page.extract_tables() |
| 创建 PDF | reportlab | SimpleDocTemplate |
| 填写表单 | pdf-lib / pypdf | 见 forms.md 工作流 |
| OCR 扫描件 | pytesseract | 先转图片再 OCR |
| PDF 转图片 | pypdfium2 | page.render() |
| 添加水印 | pypdf | page.merge_page(watermark) |
| 加密保护 | pypdf | writer.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 Skill | PDF Skill |
|---|---|---|
| 文件格式 | Word 文档(可编辑) | PDF(固定布局) |
| 核心挑战 | XML 结构操作 | 固定布局数据提取 |
| 表单处理 | 相对简单 | 复杂(可填写/不可填写两种) |
| 技术栈 | docx-js + Python | 6+ 工具协作 |
| OCR 需求 | 几乎不需要 | 扫描件必需 |
| 输出保真度 | 可能丢失格式 | 精确保持布局 |
总结
PDF Skill 的核心价值在于提供了一个完整的 PDF 处理工具箱,覆盖了从数据提取到文档生成的全流程:
- 多工具协作:不同任务使用最适合的工具
- 表单填写完整方案:同时支持可填写和扫描件表单
- 性能优化指导:针对大文件和批量处理的优化建议
- 错误处理机制:加密、损坏、OCR 失败的处理方案
+-------------------------------------------------------------------------+
| PDF Skill 核心价值 |
+-------------------------------------------------------------------------+
| |
| "PDF 处理的核心挑战在于 PDF 是一种'最终输出格式', |
| 它的设计目标是精确显示而非便于编辑。 |
| PDF Skill 通过组合多个专业工具, |
| 让 Claude 能够高效地处理这种'不友好'的文件格式。" |
| |
+-------------------------------------------------------------------------+