document-pdf について
document-pdf は PDF ワークフロー向けのスキルで、アクセシビリティ、墨消し、メタデータ、抽出品質に関する開発者向けの指針とスクリプトを提供します。機密情報が実際に削除されたかの検証を重視し、PDFツールのライセンスや保守上のリスクも示します。
主な機能
- 01証拠確認を伴う実際の墨消し
- 02PDFとファイルシステムのメタデータ削除
- 03OCRと表抽出のガイダンス
- 04PDF/UAとEAAのアクセシビリティ指針
- 05PDFの結合・分割・回転スクリプト
- 06署名・暗号化・リリース確認の指針
活用シーン
- 01公開前の機密情報の削除と検証
- 02配布前のPDFメタデータの整理
- 03スキャン文書からのテキストや表の抽出
- 04PDFのアクセシビリティと長期保存適合性の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vasilyu1983/ ai-agents-public --skill document-pdfインストール後、Claude Code で/document-pdfを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
learnings.consolidated.mdlearnings.mdagents/openai.yamlassets/invoice-template.mdpdf-release-checklist.mdreport-template.mddata/sources.jsonreferences/extraction-stack.mdpdf-accessibility-compliance.mdpdf-extraction-patterns.mdpdf-forms-interactive.mdpdf-generation-patterns.mdpdf-security-redaction.mdscripts/merge_pdfs.pyrotate_pdf.pyscrub_metadata.pysplit_pdf.pytest_scrub_metadata.py詳細
ドキュメント PDF スキル — クイックリファレンス
適用範囲: 公式の Anthropic pdf スキルが利用できる場合、基本的な作成、結合/分割、フォーム入力、および CLI(qpdf/pdftotext)での作業には、そちらを優先してください。このスキルは、独自の領域で使用します。アクセシビリティ(PDF/UA-1/UA-2、EAA)、実際の墨消しとその証拠ゲート、メタデータの消去、pyHanko による署名、OCR/表抽出の手順、PyMuPDF/pdf-lib のライセンスと保守に関するリスクが該当します。
- EU コンプライアンス:PDF に EAA を適用する前に、製品/サービスの対象範囲と各国での実施状況を確認してください。引用する整合規格が、Official Journal において適用される特定の法令を裏付けていることを検証してください。別の指令に基づく EN 301 549 の引用では不十分です。この適用範囲の確認には、references/pdf-accessibility-compliance.md を読み込んでください。
- メタデータは複数の層に存在します。PDF Info/XMP、ファイルシステムの日付、OS の拡張属性です。1 つの層を消去しても、ほかの層は残ります。
基本的な判断ルール
- まず、デジタル生成 PDF(選択可能なテキスト)か、スキャン PDF(画像)かを判断してください。スキャン PDF では通常 OCR が必要です。
references/pdf-extraction-patterns.mdを参照してください。 - アクセシビリティ/コンプライアンスが必要な場合は、タグなし PDF を「後から修正」するのではなく、構造をサポートするソース形式(DOCX/HTML + 適切なエクスポート)からの生成を優先してください。
- 決定論的な処理(結合/分割/回転/消去)では、その場しのぎで再実装するより
scripts/のヘルパーを優先してください。 - 黒い矩形やオーバーレイを墨消しとして扱わないでください。本当の墨消しではコンテンツのバイト列を削除します。各ページで PyMuPDF の
page.add_redact_annot(rect)を実行し、続けてpage.apply_redactions()を実行してから保存します。墨消しの証拠ゲート で確認してください。 - パスワード保護:pypdf の
writer.encrypt(..., algorithm='AES-256')を使用します(セキュリティハンドラー R6)。algorithmを省略すると RC4-128 で書き込まれるため、必ず指定してください。名前が明確に指定された旧式のリーダーに限り、AES-256-R5を使用してください。権限フラグは目安であり、セキュリティ機能ではありません。references/pdf-security-redaction.md を参照してください。 - 表の抽出は確率的であり、決定論的ではありません。最初に
pdfplumberを実行し、出力を元のページと照合して抜き取り確認してください。列や行が明らかに誤っている場合に限りCamelotに切り替え、出力を盲信せず、必ず Camelot の表ごとのaccuracyスコアを確認してください。 PyMuPDF/fitz(scrub_metadata.pyと、以下の墨消し/OCR 前処理コードの大半で使用)は、AGPL-3.0 / commercial のデュアルライセンスです。クローズドソース製品や SaaS バックエンドに組み込んで出荷する前に、この点を明示してください。AGPL のネットワーク利用条項により、ソースコードの開示義務が発生する場合があります。Artifex から商用ライセンスを取得するか、必要な機能が重複する範囲でpypdf/pdfplumberに置き換えてください。pdf-lib(Node):依存する前に、上流パッケージのリリース状況を確認してください。更新が滞っており、継続的な修正が必要な場合は、採用を決定する前に保守されているフォークを評価し、いずれの場合も依存関係のバージョンを固定してください。
クイックリファレンス
| タスク | ツール/ライブラリ | 言語 | 使用する場面 |
|---|---|---|---|
| PDF の作成 | pdfkit | Node.js | レポート、請求書、証明書 |
| PDF の作成 | ReportLab | Python | 複雑なレイアウト、表 |
| PDF の作成 | FPDF2 | Python | Unicode に対応したシンプルな PDF |
| PDF の編集 | pdf-lib | Node.js | 既存の PDF の変更、ページの追加(先に上流のリリース状況を確認してください) |
| 解析/結合/分割/回転 | pypdf | Python | 決定論的な PDF 操作 |
| テキストの抽出 | pdfplumber | Python | OCR を使わないテキスト抽出 |
| スキャン PDF の OCR | OCRmyPDF | Python/CLI | スキャン PDF に検索可能なテキストレイヤーを追加 |
| カスタム OCR パイプライン | PyMuPDF (fitz) + Tesseract | Python | ページ単位の OCR、または画像主体の抽出 — PyMuPDF は AGPL-3.0/商用のデュアルライセンスです |
| 表の抽出 | pdfplumber | Python | デフォルトの表抽出。信頼する前に目視で確認してください |
| 難しい表の抽出 | Camelot (camelot-py) | Python | Lattice/stream の特殊ケース。インストール済みリリースのバックエンドを確認し、いずれの場合も table.accuracy を調べてください |
| フォームへの入力 | pypdf (update_page_form_field_values) / pdf-lib | Python / Node.js | フォームの自動化については、references/pdf-forms-interactive.md を参照してください |
| PDF への署名 | pyHanko | Python/CLI | デジタル署名と検証 |
| HTML から PDF への変換 | Playwright | Node.js | ブラウザーに忠実なウェブページのレンダリング |
| HTML からタグ付き PDF への変換 | WeasyPrint | Python | セマンティック HTML、PDF/A または PDF/UA を重視したエクスポート |
| PDF/A の検証 | veraPDF | CLI/GUI | 長期保存適合性の確認 |
| PDF のアクセシビリティ検証 | veraPDF (PDF/UA-1, PDF/UA-2 profiles) + PAC / Acrobat Checker | CLI/GUI | CI で機械的に確認可能な PDF/UA ルールを検証し、その後に手動で確認 |
| ファイルメタデータの確認/編集 | exiftool | CLI | PDF/画像ファイル内の日付、XMP、EXIF、ICC を監査または書き換え |
| ファイルシステムの日付の正規化 | touch / SetFile | CLI (macOS) | タイムスタンプをリリース/ビルド日に設定します。記録の日付を遡らせないでください |
デフォルトのワークフロー
- 作成:ブラウザーに忠実な HTML/CSS には
Playwright、セマンティック/タグ付き HTML のエクスポートにはWeasyPrint、Python 中心のレイアウトにはReportLab、Node.js 中心のカスタムレイアウトにはpdfkitを使用します。 - 抽出:まずファイルがデジタル生成かスキャンかを分類します。スキャン PDF は後続の抽出処理の前に
OCRmyPDFを実行し、その後references/pdf-extraction-patterns.mdを使用します。 - リリース:
assets/pdf-release-checklist.mdを実行します。アクセシビリティが重要な PDF にはPAC/Acrobat のチェックを追加し、長期保存適合性が重要な場合はveraPDFを使用します。
スクリプトと終了コード
各スクリプトには Python 3 と、--help に記載された依存関係が必要です。
python3 scripts/merge_pdfs.py merged.pdf a.pdf b.pdf
python3 scripts/split_pdf.py in.pdf out_dir --each-page
python3 scripts/rotate_pdf.py in.pdf out.pdf --degrees 90
python3 scripts/scrub_metadata.py in.pdf out.pdf
python3 scripts/scrub_metadata.py in.pdf out.pdf --filesystem-date <publication-date> --strip-xattrs
python3 scripts/test_scrub_metadata.py
- 入力エラーではゼロ以外の終了コードを返します。argparse の使用法エラーでは 2 を返します。
scrub_metadata.pyは、サニタイズまたは要求されたファイルシステム操作に失敗した場合、stderr にエラーを出力して 1 を返します。出力を宛先の隣に一時保存し、要求されたすべての操作が成功した後にのみ置き換えるため、失敗時も既存の宛先は保持されます。入力と出力は異なる必要があります。macOS では--strip-xattrsがxattrを使用して出力のすべての属性を消去します。--filesystem-dateでは作成日時の設定にもSetFileが必要です。その他のプラットフォームではアクセス日時と変更日時のみをサポートし、--strip-xattrsは拒否されます。 scrub_metadata.pyは Info/XMP メタデータ、添付ファイル、JavaScript、サムネイルを削除し、デフォルトでは OCR テキストレイヤーとリンクを保持します。PyMuPDF のscrub()自体は両方を削除しますが、このスクリプトが削除するのは--remove-hidden-text/--remove-linksが指定された場合のみです。OCR レイヤーを削除すると、スキャン PDF は検索できなくなり、アクセスも困難になります。--strip-xattrsは消去後に属性が残っていないか確認します。macOS ではコマンドが成功しても、保護された来歴属性が残る場合があり、その場合ヘルパーは公開を拒否します。あらゆる痕跡が削除されたと思い込まず、該当するホストポリシーを確認し、リリースファイルを別途検証してください。
実施すること/避けること
実施すること
- バージョン管理されたソース文書(文書/スライド/デザインファイル)をPDFと一緒に保管します。
- 長い文書では、リンクと読み上げ順序を確認します。
- 実際に墨消しを行い、コピー&ペーストでテストします。
- スキャンしたPDFからテキストを抽出する前に、
OCRmyPDFを使用します。 - 配布前に、すべてのメタデータ層(PDF内部、ファイルシステムの日付、macOSのxattrs)を消去します。
- 消去後に
exiftool -all -G1で確認し、意図せず公開されるユーザー名、パス、ツールの記録、日付が残っていないか調べます。 - クローズドソースまたはSaaSのコードパスでPyMuPDFを使用する前に、AGPL/商用ライセンスがデプロイ環境に適合することを確認します。
避けること
- ソース文書があるのに、PDFを主な編集対象にすること。
- 新しいワークフローで
wkhtmltopdfをデフォルトで使用すること。 - リンクが壊れていたり、図表が判読できなかったりするPDFを公開すること。
- 明示的な承認なしに、顧客のPIIや秘密情報をPDFに含めること。
- ファイルシステムの日付やOSレベルのxattrsを無視して、PDF内部のメタデータだけを消去すること。
- 記録の作成時期を偽るために、ファイルやメタデータの日付を遡らせること(改ざん)。代わりに、実際の公開日に合わせて正規化します。
- 金融文書や法務文書について、目視による抜き取り確認や精度スコアのレビューをせずに、
Camelot/pdfplumberの表の出力を信頼すること。列のずれはエラーが表示されないまま発生します。 - AGPLの義務を確認したり商用ライセンスの予算を確保したりせずに、PyMuPDFをプロプライエタリ製品に組み込むこと。
エクスポートの品質確認では、pdftoppm -png -r 80 out.pdf page(Poppler)ですべてのページをレンダリングし、assets/pdf-release-checklist.mdとあわせてpage-*.pngファイルを確認します。
墨消しの検証要件
値を開示する可能性があるすべての形式について、墨消しを検証します。対象には、抽出テキスト、検索結果、コピー&ペースト、ページのレンダリング、注釈、フォームフィールド、添付ファイル、メタデータが含まれます。最終保存したファイルを別のパーサーまたはビューアーで開き直し、機密トークンとその正規化した表記を検索します。墨消し領域を高倍率で確認し、オーバーレイ、テキストのずれ、グリフの欠けを見つけます。ログに機密情報を再掲せず、検証に使用したトークンの一覧または合成した代替文字列を記録します。OCRを使用した場合は、表示される画像と隠しテキストレイヤーの両方をテストします。黒いボックス、一つのビューアーで検索結果が表示されないこと、またはメタデータだけを消去したことは、コンテンツが削除された証拠として不十分です。
ナビゲーション
リソース
- references/pdf-generation-patterns.md — 複雑なレイアウト、複数ページのドキュメント
- references/pdf-extraction-patterns.md — テキスト、表、画像の抽出
- references/extraction-stack.md — 新しい LLM/RAG パイプライン用に抽出ツール(ネイティブ解析、Docling、OCR)を選ぶ際に読み込みます
- references/pdf-accessibility-compliance.md — タグ付き PDF、PDF/UA、EAA 準拠
- references/pdf-forms-interactive.md — AcroForms、フォーム入力、デジタル署名
- references/pdf-security-redaction.md — 暗号化、権限、実際の墨消し
- data/sources.json — ライブラリのドキュメントへのリンク
スクリプト
scripts/merge_pdfs.py— PDF を順番どおりに結合scripts/split_pdf.py— 1 ページごと、または範囲を指定して分割scripts/rotate_pdf.py— すべてのページを 90/180/270 度回転scripts/scrub_metadata.py— Info/XMP メタデータ、添付ファイル、JavaScript、サムネイルを削除(デフォルトでは OCR テキストとリンクを保持)
テンプレート
- assets/invoice-template.md — 請求書の PDF 生成
- assets/report-template.md — 複数ページのレポート構成
- assets/pdf-release-checklist.md — リンク、アクセシビリティ、エクスポートの忠実度
関連スキル
- ../document-docx/SKILL.md — Word ドキュメントの生成
- ../document-xlsx/SKILL.md — Excel/スプレッドシートのワークフロー
- ../document-pptx/SKILL.md — PowerPoint プレゼンテーション
学びのループ
過去の判断や落とし穴が関連する場合は、learnings.consolidated.md があれば参照してください。必要な履歴を確認する場合、または利用可能な代替ファイルとしてのみ、learnings.md を使用してください。それ以外の場合は、どちらも参照しないでください。
内容を適用した後、記憶しておく価値のあるパターン、再発防止に役立つミス、または意外だった分野の事実に遭遇した場合は、agents-skills-feedback-loop/scripts/append_learning.py を使って、日付入りの箇条書きを 1 つ learnings.md に追記してください。SKILL.md 自体は変更しないでください。