pdf について
PDFを扱うエージェント向けのスキルで、フォーム入力、抽出、ページ描画、文書作成の手順とスクリプトを提供します。座標や回転、結合時の注意点も扱い、変更したページの目視確認を促します。
主な機能
- 01PDFフォームの入力と検証
- 02テキストと表の抽出
- 03PDFの作成・結合・編集
- 04レイアウト確認用のページ描画
- 05画像座標とPDF座標の変換
活用シーン
- 01入力可能フォームやフラットフォームの記入
- 02作成・編集したPDFの確認
- 03スキャン文書のOCR処理
- 04構造を保ったPDFの結合や分割
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ appautomaton/ document-skills --skill pdfインストール後、Claude Code で/pdfを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
forms.mdocr.mdreference.mdtables.mdscripts/check_bounding_boxes.pycheck_fillable_fields.pyconvert_pdf_to_images.pycreate_validation_image.pyextract_form_field_info.pyfill_fillable_fields.pyfill_pdf_form_with_annotations.pyflatten_form.pypdf_coords.py詳細
PDF ファイル
pypdf、pdfplumber、reportlab についてはすでにご存じでしょう。このスキルでは、それらだけではできないことを補います。入力を自己検証するフォーム入力スクリプト、読者に見えるページの状態を確認する方法、そしてコンテンツが意図せず誤った位置に配置される PDF の挙動を扱います。
スクリプトの実行
<skill> はこのファイルがあるディレクトリです。バンドルされているスクリプトは、ユーザーの作業ディレクトリから絶対パスで実行してください。そうすれば、スクリプト内のファイルへの相対パスが引き続き機能します。
uv run <skill>/scripts/convert_pdf_to_images.py report.pdf pages
作成した Python コードは、依存関係を宣言して実行してください。uv run --with pypdf script.py を使うか、PEP 723 ヘッダーを指定します。ページのレンダリングには poppler(pdftoppm)が必要です。OCR には Tesseract も必要です。
ツールの選択
| タスク | 使用するもの |
|---|---|
| フォームへの入力(入力可能フォーム、またはフラットフォーム) | forms.md を必ず使用してください。各手順に対応するスクリプトがあります。 |
| テキスト | pdfplumber、またはコマンドラインの pdftotext -layout。ページ上にテキストが見えているのに抽出されない場合は、スキャン画像です。ocr.md を参照してください。 |
| テーブル | pdfplumber:tables.md を参照してください。 |
| 新しい PDF の作成 | reportlab:流し込み形式の文書には Platypus、正確な配置には canvas を使用します。 |
| 結合、分割、回転、切り抜き、スタンプ、暗号化 | pypdf:ブックマーク、リンク、向きを維持する呼び出しについては reference.md を参照してください。 |
| ページの見た目の確認 | scripts/convert_pdf_to_images.py |
出力の確認
PDF を作成または変更したら、必ず変更したページをレンダリングして、納品前に確認してください。テキストが表示され、読みやすいこと、切れていたり重なっていたりする箇所がないこと、すべてのスタンプや値が正しい位置にあることを確認します。
uv run <skill>/scripts/convert_pdf_to_images.py out.pdf check --pages 1-3
気づかないうちに失敗する落とし穴
- 座標系が 2 種類あります。 PDF の座標はページ枠の左下を原点とし、単位はポイントです。pdfplumber とページ画像の座標は左上を原点とします。ページ枠の原点は (0, 0) とは限らないため、
page.cropbox.leftと.bottomを確認してください。 - 回転したページ。
/Rotateは表示上のみページを回転させます。コンテンツとフォームフィールドの座標は回転前のままです。単純な拡大縮小と y 軸の反転だけで配置すると、誤った位置に置かれます。scripts/pdf_coords.pyでボックスを変換し、スタンプを追加する前にpage.transfer_rotation_to_content()を呼び出してください。 - 新しい PDF の非ラテン文字。 reportlab の組み込みフォントでは、中国語やキリル文字などの文字が黒い四角で描画されます。TrueType フォントを登録して埋め込んでください。reference.md を参照してください。
- 結合。
PdfWriter.append()はブックマークとリンクを維持しますが、add_page()でページをコピーすると、それらは失われます。同じフィールド名を持つフォームを結合すると 1 つのフィールドになるため、一方に入力すると両方に入力されます。 - AES 暗号化には
uv run --with 'pypdf[crypto]'が必要です。これがないと、pypdf は開くとき、または暗号化するときにDependencyErrorを発生させます。
スクリプト
| スクリプト | 機能 |
|---|---|
check_fillable_fields.py <pdf> | forms.md のどのフォーム入力手順を使うべきかを示します |
extract_form_field_info.py <pdf> <out.json> | 入力可能なフィールド、そのページ、ボックス、受け付ける値を一覧表示します |
fill_fillable_fields.py <pdf> <values.json> <out.pdf> | すべての ID、ページ、値を確認してからフィールドに入力します |
convert_pdf_to_images.py <pdf> <dir> [--pages] [--fields] | ページを 1 ページずつ PNG にレンダリングします。必要に応じて入力可能な各フィールドの輪郭も表示します |
check_bounding_boxes.py <fields.json> [pdf] | フラットフォームへの入力前に、ボックスの重なりや高さ不足を検出します |
create_validation_image.py <page> <fields.json> <png> <out.png> | 目視確認用に、ページ画像上へボックスを描画します |
fill_pdf_form_with_annotations.py <pdf> <fields.json> <out.pdf> | どの環境でも同じようにレンダリングされるテキストでフラットフォームに入力します |
flatten_form.py <pdf> <out.pdf> | 入力済みの値をページに描画し、編集できないようにします |
pdf_coords.py <pdf> <page> <WxH> --to-pdf/--to-image <box> | ページ画像のピクセルと PDF のポイントの間でボックスを変換します |
コメント
Markdown 対応