pdf について
pdfは、データ抽出、文書作成、フォーム処理を行うユーザー向けのPDF処理スキルです。テキストや表の抽出、PDF作成、結合・分割、フォーム入力に対応し、出力の検証も扱います。
主な機能
- 01テキストと表を抽出してデータ出力
- 02テキストや図を含むPDFの作成
- 03PDFの結合、分割、回転
- 04PDFフォームの確認と入力
- 05複数PDFの一括処理
活用シーン
- 01PDFの表を抽出してExcelやCSVに出力
- 02レポート、証明書、請求書のPDF作成
- 03文書の結合やページ単位の分割
- 04申請書などのPDFフォームへの入力
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ stvlynn/ dingtalk-wukong-skills --skill pdfインストール後、Claude Code で/pdfを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
requirements.txtdocs/00-SKILL-完整处理指南.mdforms.mdpdf_to_word_conversion_guide.mdreference.md詳細
PDF文書処理エキスパート Real Skill
一言で説明
テキストや表の抽出、PDF の作成、文書操作、フォーム入力に対応した、包括的な PDF 文書処理ツールです。
PDF Processing Guide - テキストや表の抽出、新しい PDF の作成、文書の結合・分割、フォームの処理に対応した包括的な PDF 操作ツールキットです。
使用シーン
適しています:
- PDF からテキストや表データを抽出し、Excel にエクスポートする
- 新しい PDF 文書(レポート、証明書、請求書)を作成する
- PDF 文書を結合、分割、回転する
- PDF フォーム(政府機関のフォーム、申請書)に入力する
- 複数の PDF ファイルを一括処理する
適していません:
- スキャンされた PDF(先に OCR 処理が必要です)
- 複雑な PDF の編集(専用ソフトウェアを使用してください)
コアプロセス
用户需求 → 判断任务类型 → 选择工具 → 执行操作 → 验证输出
User request → Task type classification → Tool selection → Execute → Validate
タスクの種類を判断する(Task Classification):
データの抽出(Extracting Data)
- テキスト抽出(Text extraction) → pdfplumber.extract_text()
- テキスト抽出の精度は pypdf より高いです
- 表の抽出(Table extraction) → pdfplumber.extract_tables() + pandas
- インテリジェントな表構造認識
- Excel、CSV、JSON へのエクスポート
PDF の作成(Creating PDFs)
- シンプルな文書(Simple documents) → reportlab.pdfgen.canvas
- テキストとグラフィックを使って文書をすばやく作成します
- 複雑なレイアウト(Complex layouts) → reportlab.platypus
- 高度なスタイル設定を使用した段落、表、画像
PDF 操作(PDF Operations)
- 結合(Merge) → pypdf.PdfWriter
- 複数の PDF を 1 つにまとめます
- 分割(Split) → pypdf.PdfWriter(各ページを個別に保存)
- 回転(Rotate) → page.rotate()
- メタデータ(Metadata) → pypdf.PdfReader.metadata / PdfWriter.add_metadata()
フォーム処理(Form Processing)
- フィールドの表示(View fields) → forms.md を参照してください
- フォームへの入力(Fill forms) → forms.md を参照してください
- 一括処理(Batch processing) → ループ + フォーム入力 API
タスク完了基準
必須条件(すべて満たす必要があります):
- PDF ファイルが正常に開ける
- 抽出したデータが完全かつ正確である
- 表の構造が正しく保持されている(行と列が対応している)
- 作成した PDF の内容が明瞭で読みやすい
品質評価:
- ⭐⭐⭐⭐⭐ 優秀 - データが完全 + 書式が適切 + 自動一括処理
- ⭐⭐⭐ 合格 - データが正確 + PDF が使用可能
- ⭐ 失敗 - データが欠落、または PDF が破損
参考資料(AI 向け)
| 種類 | パス | 説明 |
|---|---|---|
| コアドキュメント | docs/00-SKILL-完整处理指南.md | PDF 処理の包括的なガイド(約 300 行) |
| フォーム処理 | docs/forms.md | PDF フォーム入力の詳細なチュートリアル |
| 高度なリファレンス | docs/reference.md | JavaScript ライブラリと高度な機能 |
重要な原則(AI 必読 / Critical Principles)
1. 抽出には pdfplumber を優先する(Prefer pdfplumber for Extraction)
- テキスト抽出:pypdf より高精度です
- 表の認識:表の認識能力に優れています
- レイアウトの保持:レイアウト情報を保持します
- 複雑な PDF:複雑な PDF の処理に適しています
2. 表データの正規化(Table Data Normalization)
# Best practice for table extraction
import pdfplumber
import pandas as pd
all_tables = []
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
if table: # Check not empty
df = pd.DataFrame(table[1:], columns=table[0]) # First row as header
all_tables.append(df)
# Combine and clean
combined = pd.concat(all_tables, ignore_index=True)
combined.to_excel("output.xlsx", index=False)
3. スキャンされた PDF には OCR が必要です(Scanned PDFs Require OCR)
- 判定:テキスト抽出の結果が空、または文字化けしている場合
- 処理:まず OCR ツール(Tesseract、Adobe Acrobat など)を使用する必要があります
- ユーザーへの通知:OCR による前処理が必要であることを、ユーザーにはっきりと伝えてください
4. 大容量ファイルのメモリ管理(Memory Management for Large Files)
- 複数の PDF は一括処理します
- 文書全体を読み込むのではなく、ページを順番に処理します
- 可能な場合はジェネレーターを使用します
クイックコマンドリファレンス(Quick Commands)
テキスト抽出(Text Extraction)
import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
表を Excel に変換(Table to Excel)
import pdfplumber
import pandas as pd
all_tables = []
with pdfplumber.open("document.pdf") as pdf:
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)
combined = pd.concat(all_tables, ignore_index=True)
combined.to_excel("extracted_tables.xlsx", index=False)
PDF の結合(Merge PDFs)
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 の分割(Split PDF)
from pypdf import PdfReader, PdfWriter
reader = PdfReader("large_document.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)
PDF の作成(Create PDF)
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("hello.pdf", pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "Hello World!")
c.save()
メタデータの抽出(Extract Metadata)
from pypdf import PdfReader
reader = PdfReader("document.pdf")
meta = reader.metadata
print(f"Title: {meta.title}")
print(f"Author: {meta.author}")
print(f"Pages: {len(reader.pages)}")
依存関係のインストール(Dependencies Installation)
Python の依存関係
pip install -r requirements.txt
# Includes: pypdf, pdfplumber, reportlab, pandas, openpyxl
よくあるシナリオの例(Common Scenarios)
シナリオ 1:請求書の表を一括抽出する(Batch Extract Invoice Tables)
import pdfplumber
import pandas as pd
import glob
all_data = []
for pdf_file in glob.glob("invoices/*.pdf"):
with pdfplumber.open(pdf_file) as pdf:
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
if table:
df = pd.DataFrame(table[1:], columns=table[0])
df['source_file'] = pdf_file
all_data.append(df)
combined = pd.concat(all_data, ignore_index=True)
combined.to_excel("all_invoices.xlsx", index=False)
シナリオ 2:表付きのレポートを作成する(Create Report with Table)
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
doc = SimpleDocTemplate("report.pdf", pagesize=letter)
styles = getSampleStyleSheet()
story = []
# Title
story.append(Paragraph("Sales Report", styles['Title']))
# Table
data = [
['Product', 'Q1', 'Q2', 'Q3', 'Q4'],
['Product A', '1000', '1200', '1100', '1300'],
['Product B', '800', '900', '950', '1000']
]
t = Table(data)
t.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), 'grey'),
('TEXTCOLOR', (0, 0), (-1, 0), 'white'),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('GRID', (0, 0), (-1, -1), 1, 'black')
]))
story.append(t)
doc.build(story)
コメント
Markdown 対応