mcpField
D
document-processing

document-processing

github.com/dirnbauer文档处理33308 次安装13 周前更新
代码仓库

关于 document-processing

document-processing 是面向 Claude Code 和 AI Agent 的办公文档处理 Skill,涵盖 PDF、Word、PowerPoint 和 Excel。它按任务列出常用工具与处理流程,支持提取、创建、编辑和分析文档。

主要功能

  1. 01处理 PDF、DOCX、PPTX 和 XLSX
  2. 02提取文本与表格数据
  3. 03创建和编辑办公文档
  4. 04合并、拆分及 OCR 处理 PDF
  5. 05使用 pandas 分析 Excel 数据
  6. 06提供 OOXML 编辑流程

适用场景

  1. 01从扫描 PDF 提取文本
  2. 02创建或修改 Word 和演示文稿
  3. 03汇总 Excel 工作簿数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dirnbauer/webconsulting-skills --skill document-processing

安装后在 Claude Code 中输入/document-processing确认已加载。

详细介绍

文档处理

**来源:**此技能改编自 Anthropic 的文档处理技能 面向 Claude Code 和 AI Agent 的文档处理技能(pdf、docx、pptx、xlsx)。

创建、编辑和分析办公文档,包括 PDF、Word 文档、PowerPoint 演示文稿和 Excel 电子表格。


快速参考:选择要使用的工具

任务文档类型最佳工具
提取文本PDFpdfplumber、pdftotext
合并/拆分PDFpypdf、qpdf
填写表单PDFpdf-lib(JS)、pypdf
创建新文档PDFreportlab
对扫描件进行 OCRPDFpytesseract + pdf2image
提取文本DOCXpandoc、markitdown
创建新文档DOCXdocx-js(JS)
编辑现有文档DOCXOOXML(解包/编辑/打包)
提取文本PPTXmarkitdown
创建新文档PPTXhtml2pptx、PptxGenJS
编辑现有文档PPTXOOXML(解包/编辑/打包)
数据分析XLSXpandas
公式/格式设置XLSXopenpyxl

PDF 处理

提取文本
import pdfplumber

# Extract text with layout preservation
with pdfplumber.open("document.pdf") as pdf:
    for page in pdf.pages:
        text = page.extract_text()
        print(text)
提取表格
import pdfplumber
import pandas as pd

with pdfplumber.open("document.pdf") as pdf:
    all_tables = []
    for page in pdf.pages:
        tables = page.extract_tables()
        for table in tables:
            if table:
                df = pd.DataFrame(table[1:], columns=table[0])
                all_tables.append(df)

# Combine all tables
if all_tables:
    combined_df = pd.concat(all_tables, ignore_index=True)
    combined_df.to_excel("extracted_tables.xlsx", index=False)
合并 PDF
from pypdf import PdfWriter, PdfReader

writer = PdfWriter()
for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
    reader = PdfReader(pdf_file)
    for page in reader.pages:
        writer.add_page(page)

with open("merged.pdf", "wb") as output:
    writer.write(output)
拆分 PDF
from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)
    with open(f"page_{i+1}.pdf", "wb") as output:
        writer.write(output)
旋转页面
from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

page = reader.pages[0]
page.rotate(90)  # Rotate 90 degrees clockwise
writer.add_page(page)

with open("rotated.pdf", "wb") as output:
    writer.write(output)
对扫描版 PDF 进行 OCR
# Requires: pip install pytesseract pdf2image
import pytesseract
from pdf2image import convert_from_path

# Convert PDF to images
images = convert_from_path('scanned.pdf')

# OCR each page
text = ""
for i, image in enumerate(images):
    text += f"Page {i+1}:\n"
    text += pytesseract.image_to_string(image)
    text += "\n\n"

print(text)
添加水印
from pypdf import PdfReader, PdfWriter

watermark = PdfReader("watermark.pdf").pages[0]
reader = PdfReader("document.pdf")
writer = PdfWriter()

for page in reader.pages:
    page.merge_page(watermark)
    writer.add_page(page)

with open("watermarked.pdf", "wb") as output:
    writer.write(output)
密码保护
from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

for page in reader.pages:
    writer.add_page(page)

writer.encrypt("userpassword", "ownerpassword")

with open("encrypted.pdf", "wb") as output:
    writer.write(output)
使用 ReportLab 创建 PDF
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
from reportlab.lib.styles import getSampleStyleSheet

doc = SimpleDocTemplate("report.pdf", pagesize=letter)
styles = getSampleStyleSheet()
story = []

# Add content
title = Paragraph("Report Title", styles['Title'])
story.append(title)
story.append(Spacer(1, 12))

body = Paragraph("This is the body of the report. " * 20, styles['Normal'])
story.append(body)
story.append(PageBreak())

# Page 2
story.append(Paragraph("Page 2", styles['Heading1']))
story.append(Paragraph("Content for page 2", styles['Normal']))

doc.build(story)
命令行工具
# Extract text (poppler-utils)
pdftotext input.pdf output.txt
pdftotext -layout input.pdf output.txt  # Preserve layout

# Merge PDFs (qpdf)
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf

# Split pages
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf

# Rotate pages
qpdf input.pdf output.pdf --rotate=+90:1

# Remove password
qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf

# Extract images
pdfimages -j input.pdf output_prefix

Word 文档(DOCX)处理

提取文本
# Convert to markdown with pandoc
pandoc document.docx -o output.md

# With tracked changes preserved
pandoc --track-changes=all document.docx -o output.md
创建新文档(docx-js)
import { Document, Paragraph, TextRun, HeadingLevel, Packer } from 'docx';
import * as fs from 'fs';

const doc = new Document({
  sections: [{
    properties: {},
    children: [
      new Paragraph({
        text: "Document Title",
        heading: HeadingLevel.HEADING_1,
      }),
      new Paragraph({
        children: [
          new TextRun("This is a "),
          new TextRun({
            text: "bold",
            bold: true,
          }),
          new TextRun(" word in a paragraph."),
        ],
      }),
      new Paragraph({
        text: "This is another paragraph.",
      }),
    ],
  }],
});

// Export to file
const buffer = await Packer.toBuffer(doc);
fs.writeFileSync("output.docx", buffer);
创建包含表格的文档
import { Document, Paragraph, Table, TableRow, TableCell, Packer } from 'docx';

const table = new Table({
  rows: [
    new TableRow({
      children: [
        new TableCell({ children: [new Paragraph("Header 1")] }),
        new TableCell({ children: [new Paragraph("Header 2")] }),
        new TableCell({ children: [new Paragraph("Header 3")] }),
      ],
    }),
    new TableRow({
      children: [
        new TableCell({ children: [new Paragraph("Cell 1")] }),
        new TableCell({ children: [new Paragraph("Cell 2")] }),
        new TableCell({ children: [new Paragraph("Cell 3")] }),
      ],
    }),
  ],
});

const doc = new Document({
  sections: [{
    children: [
      new Paragraph({ text: "Table Example", heading: HeadingLevel.HEADING_1 }),
      table,
    ],
  }],
});
编辑现有文档(OOXML)

对于复杂编辑,请直接处理原始 OOXML:

  1. 解包文档:

    python ooxml/scripts/unpack.py document.docx unpacked/
    
  2. 编辑 XML 文件(主要是 word/document.xml)

  3. 验证并打包:

    python ooxml/scripts/validate.py unpacked/ --original document.docx
    python ooxml/scripts/pack.py unpacked/ output.docx
    
修订工作流

使用修订功能审阅文档:

# 1. Get current state
pandoc --track-changes=all document.docx -o current.md

# 2. Unpack
python ooxml/scripts/unpack.py document.docx unpacked/

# 3. Edit using tracked change patterns
# Use <w:ins> for insertions, <w:del> for deletions

# 4. Pack final document
python ooxml/scripts/pack.py unpacked/ reviewed.docx

PowerPoint(PPTX)处理

提取文本
python -m markitdown presentation.pptx
创建新演示文稿(PptxGenJS)
import PptxGenJS from 'pptxgenjs';

const pptx = new PptxGenJS();

// Slide 1 - Title
const slide1 = pptx.addSlide();
slide1.addText("Presentation Title", {
  x: 1, y: 2, w: 8, h: 1.5,
  fontSize: 36,
  bold: true,
  color: "363636",
  align: "center",
});
slide1.addText("Subtitle goes here", {
  x: 1, y: 3.5, w: 8, h: 0.5,
  fontSize: 18,
  color: "666666",
  align: "center",
});

// Slide 2 - Content
const slide2 = pptx.addSlide();
slide2.addText("Key Points", {
  x: 0.5, y: 0.5, w: 9, h: 0.8,
  fontSize: 28,
  bold: true,
});
slide2.addText([
  { text: "• First important point\n", options: { bullet: true } },
  { text: "• Second important point\n", options: { bullet: true } },
  { text: "• Third important point\n", options: { bullet: true } },
], {
  x: 0.5, y: 1.5, w: 9, h: 3,
  fontSize: 18,
});

// Slide 3 - Chart
const slide3 = pptx.addSlide();
slide3.addChart(pptx.ChartType.bar, [
  { name: "Q1", labels: ["Jan", "Feb", "Mar"], values: [100, 200, 300] },
  { name: "Q2", labels: ["Apr", "May", "Jun"], values: [150, 250, 350] },
], {
  x: 1, y: 1, w: 8, h: 4,
  showLegend: true,
  legendPos: "b",
});

// Save
pptx.writeFile("output.pptx");
编辑现有演示文稿(OOXML)
# 1. Unpack
python ooxml/scripts/unpack.py presentation.pptx unpacked/

# 2. Key files:
# - ppt/slides/slide1.xml, slide2.xml, etc.
# - ppt/notesSlides/ for speaker notes
# - ppt/theme/ for styling

# 3. Validate and pack
python ooxml/scripts/validate.py unpacked/ --original presentation.pptx
python ooxml/scripts/pack.py unpacked/ output.pptx
创建缩略图网格
# Create visual overview of all slides
python scripts/thumbnail.py presentation.pptx --cols 4
将幻灯片转换为图像
# Convert to PDF first
soffice --headless --convert-to pdf presentation.pptx

# Then PDF to images
pdftoppm -jpeg -r 150 presentation.pdf slide
# Creates slide-1.jpg, slide-2.jpg, etc.

Excel(XLSX)处理

使用 Pandas 进行数据分析
import pandas as pd

# Read Excel
df = pd.read_excel('file.xlsx')  # Default: first sheet
all_sheets = pd.read_excel('file.xlsx', sheet_name=None)  # All sheets as dict

# Analyze
df.head()      # Preview data
df.info()      # Column info
df.describe()  # Statistics

# Filter and transform
filtered = df[df['Sales'] > 1000]
grouped = df.groupby('Category')['Revenue'].sum()

# Write Excel
df.to_excel('output.xlsx', index=False)
使用公式创建 Excel 文件(openpyxl)
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment

wb = Workbook()
sheet = wb.active

# Add data
sheet['A1'] = 'Product'
sheet['B1'] = 'Price'
sheet['C1'] = 'Quantity'
sheet['D1'] = 'Total'

# Header formatting
for cell in ['A1', 'B1', 'C1', 'D1']:
    sheet[cell].font = Font(bold=True, color='FFFFFF')
    sheet[cell].fill = PatternFill('solid', start_color='4472C4')
    sheet[cell].alignment = Alignment(horizontal='center')

# Add data rows
data = [
    ('Widget A', 10.00, 5),
    ('Widget B', 15.00, 3),
    ('Widget C', 20.00, 8),
]

for row_idx, (product, price, qty) in enumerate(data, start=2):
    sheet[f'A{row_idx}'] = product
    sheet[f'B{row_idx}'] = price
    sheet[f'C{row_idx}'] = qty
    # FORMULA - not hardcoded value!
    sheet[f'D{row_idx}'] = f'=B{row_idx}*C{row_idx}'

# Add sum formula at bottom
last_row = len(data) + 2
sheet[f'D{last_row}'] = f'=SUM(D2:D{last_row-1})'

# Column width
sheet.column_dimensions['A'].width = 15
sheet.column_dimensions['B'].width = 10
sheet.column_dimensions['C'].width = 10
sheet.column_dimensions['D'].width = 10

wb.save('output.xlsx')
财务模型标准
颜色编码
from openpyxl.styles import Font

# Industry-standard colors
BLUE = Font(color='0000FF')   # Hardcoded inputs
BLACK = Font(color='000000')  # Formulas
GREEN = Font(color='008000')  # Links from other sheets
RED = Font(color='FF0000')    # External links

# Apply to cells
sheet['B5'].font = BLUE   # User input
sheet['B6'].font = BLACK  # Formula
数字格式
# Currency with thousands separator
sheet['B5'].number_format = '$#,##0'

# Percentage with one decimal
sheet['B6'].number_format = '0.0%'

# Zeros as dashes
sheet['B7'].number_format = '$#,##0;($#,##0);"-"'

# Multiples
sheet['B8'].number_format = '0.0x'
关键:使用公式,不要使用硬编码值
# ❌ WRONG - Hardcoding calculated values
total = df['Sales'].sum()
sheet['B10'] = total  # Hardcodes 5000

# ✅ CORRECT - Use Excel formulas
sheet['B10'] = '=SUM(B2:B9)'

# ❌ WRONG - Computing in Python
growth = (current - previous) / previous
sheet['C5'] = growth

# ✅ CORRECT - Excel formula
sheet['C5'] = '=(C4-C2)/C2'
编辑现有 Excel 文件
from openpyxl import load_workbook

# Load with formulas preserved
wb = load_workbook('existing.xlsx')
sheet = wb.active

# Modify cells
sheet['A1'] = 'New Value'
sheet.insert_rows(2)
sheet.delete_cols(3)

# Add new sheet
new_sheet = wb.create_sheet('Analysis')
new_sheet['A1'] = 'Data'

wb.save('modified.xlsx')
重新计算公式

使用公式创建或修改 Excel 文件后:

# Recalculate all formulas using LibreOffice
python recalc.py output.xlsx

依赖项

按需安装:

# PDF
pip install pypdf pdfplumber reportlab pytesseract pdf2image

# DOCX
npm install -g docx
pip install "markitdown[docx]"

# PPTX
npm install -g pptxgenjs
pip install "markitdown[pptx]"

# XLSX
pip install pandas openpyxl

# Command line tools
sudo apt-get install poppler-utils qpdf libreoffice pandoc

任务快速参考

我想要……命令/代码
提取 PDF 文本pdfplumber.open(f).pages[0].extract_text()
合并 PDFpypdf.PdfWriter() + 循环
拆分 PDF每页使用一个 PdfWriter()
对扫描版 PDF 进行 OCRpdf2image → pytesseract
将 DOCX 转换为 MDpandoc doc.docx -o doc.md
创建 DOCXdocx-js(JavaScript)
提取 PPTX 文本python -m markitdown pres.pptx
创建 PPTXPptxGenJS(JavaScript)
分析 Excelpandas.read_excel()
使用公式的 Excel 文件openpyxl

致谢与署名

此技能基于 Anthropic 的出色成果。

原始仓库:https://github.com/anthropics/skills/tree/main/skills/document-processing

特别感谢 Anthropic 慷慨地贡献开源成果,助力打造了这一技能集。 由 webconsulting.at 改编,供此技能集使用

评论

支持 Markdown