Community画像github.com

Plasmoid77/photo-to-pdf

ノート、書籍、紙文書の写真をきれいなPDFにデジタル化:見開きを分割、遠近法を補正、余白を密にトリミングし、筆記や図面をそのまま保存します。また、そのようなPDFの余白補正にも使用します。テキストの再入力やOCR、生成的な復元は目的としていません。

photo-to-pdf とは?

このスキルは、ノートや書籍、紙文書の写真をスキャンし、高品質なPDFに変換するための一連の自動化ツールを提供します。Photo-to-PDFスキルは、複数の写真からなる原稿を処理し、見開きページの自動分割、遠近法補正、および内容を切り落とさずに余白を密にトリミングする機能を備えています。特に、罫線や図面のエッジを検出して正確にページを分割する点が特徴です。このスキルは、Claude CodeやCodexなどのAIエージェント向けに設計されており、ユーザーが撮影した写真の束から、すぐに印刷や共有が可能なPDF文書を生成します。処理の各ステップ(準備、検査、ビルド、レビュー)はコマンドラインツールとして提供され、ユーザーは各ページの境界や向きを手動で微調整できます。また、AIエージェントによる自動レビュー機能を備え、エッジの欠落や背景の写り込みなどの問題を検出します。このスキールは、完全な自動化を謳うものではなく、特に重要な文書の場合には最終的な目視確認を推奨しています。

対応✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/Plasmoid77/photo-to-pdf/tree/HEAD

Installed? Explore more 画像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

写真をPDFに

目的は、正しい順序の個別ページ、密な余白、端の線を保存することです。写真をローカルで処理します。このプロセスに特別なプラグインやMCPは必要ありません。

実証済みの方法

  1. ソースを検査する。 EXIFを考慮する。名前・時間・内容で順序を確認する。撮影時刻自体は順序を証明しない。表紙、見開き、撮り直しの重複、白紙を見つける。明るさだけでは薄い図面と白紙ページを確実に区別できない。紙が明るい背景(白い机、用紙、近くの画面)の上にあり、輪郭が検出されない場合は、濃い色のつや消し面で撮り直すよう依頼する。
  2. 用紙をマークする。 個別の用紙(文書、A4、横向きを含む)には prepare --layout pages を実行する。auto は、折りの兆候(背の影や折り目)がある場合にのみ幅広の輪郭を分割するが、特殊な用紙では誤ることがある。scan.py prepare は、ドラフトのマニフェストと輪郭付きのコンタクトシートを作成する。検出器は紙を明るく彩度の低い領域として見つけ、エッジを「紙→暗い背景」の急峻な遷移に引き寄せ、見開きの場合は折り目を探す。折り目は罫線が途切れる場所である。背の影は片方のページに乗るため、深い影の場合、折り目は明るさの変化の基部、暗い側に設定される。基準ノートでは、折り目の中央誤差は2~3ピクセルである。これはあくまで仮説である。flags が空でないページ(gutter-*、partner-mismatch、touches-frame、aspect-outlier、one-side-unruled、margin-ink、contour、full-frame-fallback、duplicate)は、優先的に手動でマークする。残りは写真で確認する。検出器がモニター、レシート、または見開きの片方の半分を拾う可能性がある。scan.py inspect は、各コーナーの大きな切り抜きをフレーム分割単位で提供するので、それを使ってマニフェストのコーナーを修正する。各ページには、EXIF 回転後の座標で、TL、TR、BR、BL の4つのコーナーが割り当てられる。
  3. 遠近法を補正する。 デフォルトは、1ページあたり1つの射影行列である。自動検出されたエッジに追従して個別の行/列を動かさない。グリッド、テキスト、指、影がエッジと認識され、ページ全体に波が生じる可能性がある。明示的に要求された、反った本のページの完全な修正には、個別の実証済みアルゴリズムと追加の幾何学的検証が必要である。
  4. 余白を調整する。 どこでも均一に大きな余白を取るよりも、密なトリミングが推奨される。bleed_px のデフォルトは0である。個別に小さな余白を追加するのは、コーナー間の直線の外側に本当に書き込みや反った端に情報が残っている場合のみとする。文字の上部、点(ё、й)、左側の日付、折り目近くのテキスト、図面の下端を確認する。下端の行はしばしば端ぎりぎりまで達する。その場合の境界は端の中央値で決まり、密にはならない。密なエッジと紙の端の間にペンの線がある場合、prepare は自動的にエッジをそれらに移動する(margin_ink フィールド、幅の4%以内)。鉛筆は保護されないため、端近くの鉛筆の日付や署名は目視で確認する。反った端は直線で近似されるため、反ったページのコーナーは境界の外側にわずかに残ることがある。PDFの追加トリミングは crop コマンドで行い、再引き伸ばしやJPEG再圧縮は行わない。
  5. 薄い線を保存する。 ソフトな照明補正は許容される。ハードな2値化は鉛筆を消す可能性がある。表紙、写真、重要な色には enhance を無効にする。生成モデルで文字、図、またはフレームの欠落部分を描き足さない。OCRは、必要な場合または要求された場合にのみ追加する。
  6. 最終PDFを確認する。 利用可能なPDFスキルを使用して作成/確認を行い、そのスキルで規定されている操作マーカーを含める。review はすべてのページをレンダリングし、コンタクトシートを作成し、端に背景や書き込みがあるページをリストする(edges.json)。compare は各写真ページを4%の余白と赤いトリミング枠とともに表示し、外側に何が残っているかを確認できる。最初のページだけでなく文書全体を閲覧する。大量処理のための効率的なスキーム:全ページで compare を実行し、最大16ページの束に分けて、画像対応の安価なモデル(Claude Code では Sonnet、Codex では gpt-5.6-luna)を使用する並列エージェントに、references/screening.md のタスクを変更せずに渡す。自身は、検証者が defect と報告したページと、prepare でフラグが立ったページのみを開き、確認されたものだけを修正する。32ページのドラフトで8つの既知の3%以上のコーナー誤差があったテストでは、この方式は8つすべてを発見し(Sonnetが7つ、フラグが残り1つ)、誤検出は4つだった。Haikuは4つを発見し、誤検出のみを追加したため、Haiku単体では不十分である。2冊目のノート(32ページ、タスクは調整されていない)では、Sonnetと gpt-5.6-luna は誤検出なしで目に見える背景の帯を発見したが、1.5~2%のコーナー誤差のあるページを見逃した。gpt-6.1-terra はほぼすべてを指摘したが、19枚のクリアページのうち12枚も含めており、節約にはならない。この方式は1冊のノートで検証され、タスクも同じページで作成されている。重要な文書や疑わしい場合は、すべてのページを自身で確認する。検証者の応答のページ番号は、同時に順序の確認にもなる。トリミング後は影響を受けたページを再確認し、幾何アルゴリズムを変更した後は文書全体を再確認する。ページ数と正しいconfigは、目視確認の代わりにはならない。

このようなデジタル化では、ユーザーは確認済みの白紙ページを削除することを好む。白紙を保持する明示的なリクエストは優先される。重複は、グリッドや筆跡の類似性ではなく、目視確認後に除外する。表紙は、別の指示がない限り保存する。見開きは、ソースがそのように構成されている場合、左から右に読む。

コマンド

スクリプトへのパスは、このスキルからの相対パスで指定する。スキーマとパラメータ: references/commands.md。前のノートからコーナー、パス、ページ番号、比率を流用しない。

python3 <skill>/scripts/scan.py prepare <photos> --work <work> --layout auto
python3 <skill>/scripts/scan.py inspect <work>/manifest.json --work <work>/inspect --ids 0006-L,0006-R
python3 <skill>/scripts/scan.py build <work>/manifest.json --output <work>/draft.pdf
python3 <skill>/scripts/scan.py measure <work>/draft-pages --work <work>/measure
python3 <skill>/scripts/scan.py review <work>/draft.pdf --work <work>/review
python3 <skill>/scripts/scan.py compare <work>/draft.scan.json --work <work>/compare

依存関係: Pillow、NumPy、OpenCV、ReportLab(写真用)。pypdfium2(crop 用)。Poppler pdftoppm(PDFからの review と measure 用)。インポートはコマンドごとに分かれている。利用可能なインタプリタ/既存の環境を確認する。必要に応じて、グローバルなPythonを変更せずに個別のvenvを使用する。OpenCV/NumPyがシステムパッケージとしてインストールされている場合、同じインタプリタで --system-site-packages を指定してvenvを作成する(python3 -m venv。uv venv はデフォルトで独自のPythonを使用し、システムのcv2を認識しない)。ネットワークは必須と想定しない。特定マシンのキャッシュからのパスをスキルに埋め込まない。

ページのアスペクト比とサイズ。 aspect: null は輪郭の辺から推定され、角度によって1~2%ずれることがある。方眼紙の場合は、ドラフトを収集して measure を実行する。方眼のピッチを検出し、ページの物理サイズを計算し、ノート全体に1つの aspect と --width-mm を提案する。値は出力から取得し、前のノートからは取得しない。同じ --width-mm で、すべてのPDFページは同じ物理サイズになる。そうしない場合、サイズはピクセルと --dpi から計算され、撮影距離に応じて変動する。

build は、含まれるページに reviewed: true を要求する。これはエージェントによるマークアップ確認のマークであり、ユーザーとの追加の調整ではない。既に渡された写真のルーチン処理について許可を求めない。

検出器の回帰テスト。 検証済みのノートのマニフェストをリファレンスとする。scan.py を変更した後、同じ写真で prepare を実行し、eval <新しいマニフェスト> --reference <リファレンス> を実行する。このコマンドは、ページ幅に対するコーナー誤差のパーセンテージ、フラグが立てられたページの割合、および「サイレント」エラー(誤差が --tolerance(デフォルト3%)を超えるがフラグが立てられていないページ)を表示する。サイレントエラーが --max-silent より多い場合、リターンコードは1になる。個人写真を含むリファレンスはスキルのリポジトリに置かない。

完了

  • 元の写真は変更しない。既存のPDFは、新しいバージョンを確認した後に置き換える。部分的な修正のためにマークアップとパラメータを保存する。
  • 再修正時は、まずファイルの最新性を確認する。JPEG再圧縮が累積しないようにする。
  • 結果、ページ数、およびソースの重要な制限を報告する。書き込みの一部が既にフレーム外にある場合は、復元を主張するのではなく、その旨を明記する。
  • このスキルは準備とコードの再作成を節約する。完全に自動化された境界認識と目視確認の省略を約束するものではない。

関連スキル