• #Claude Code
  • #PDF
  • #自動化
  • #スラッシュコマンド
  • #サブエージェント
  • #画像認識
開発メモ

Claude Codeのスラッシュコマンド + 画像認識でスキャンしたPDFを自動リネームする

結論

裁断した本をスキャンしてPDF化した後のリネーム作業は、Claude Codeのスラッシュコマンド /rename-pdf で自動化できる。pymupdfでPDFのページを画像として抽出し、Claudeの画像認識でタイトルを判断する方式が最も精度が高い。サブエージェント並列処理により、PDF数に関わらず約1-2分で完了する。

/rename-pdf C:\Fi7260読み取り

背景・課題

裁断した本をスキャンしてPDF化した後、手動でタイトルを付けるのが面倒だった。

  • PDFを開いてタイトルをコピー&ペーストするだけの作業
  • Acrobatが重くて時間がかかる
  • 1ファイルずつ処理するのが億劫

試行錯誤の経緯

1. 最初のアプローチ:Pythonスクリプト + ディレクトリ監視

watchdog でディレクトリを監視し、新しいPDFが入った瞬間に自動リネームするスクリプトを最初に検討した。

# 常駐型スクリプト
from watchdog.observers import Observer
# PDFが入ったら検知 → タイトル抽出 → リネーム

問題点:

  • 常駐プロセスが必要
  • タイトル抽出がヒューリスティック(最初の意味のある行を採用)
  • 「新版」「改訂版」などがタイトルになる誤認識

2. 都度実行型に変更

常駐型をやめて、batファイルにドラッグ&ドロップで実行する方式に変更。

@echo off
cd /d "%~dp0"
uv run rename_pdf.py %*

uv run を使うことで環境を汚さずに実行できる。

3. スラッシュコマンドへの移行

Pythonのヒューリスティック判定に限界を感じ、Claude Codeのスラッシュコマンドに移行。

作成したコマンド:

  • プロジェクトレベル: .claude/commands/rename-pdf.md(並列処理版)

4. テキスト抽出から画像認識への移行

最初はpymupdfでテキスト抽出を試したが、スキャンPDFはOCR処理されていないためテキストが取得できない場合が多かった。

解決策: PDFページを画像として抽出し、Claudeの画像認識でタイトルを判断

import fitz
doc = fitz.open('スキャンPDF.pdf')
page = doc[0]
pix = page.get_pixmap(dpi=150)
pix.save('/tmp/page1.png')

画像認識により、OCR処理されていないスキャンPDFでも正確にタイトルを抽出できるようになった。

5. 分冊スキャン対応

スキャナーの性質上、300ページの本を150ページずつ分割してスキャンすることがある。

  • 前半PDF: 1ページ目(表紙)にタイトルがある
  • 後半PDF: 1ページ目は本文の途中、タイトルがない

→ 最後のページ(奥付)にタイトルが記載されているので、表紙にタイトルがなければ奥付を確認するようにした。

6. サブエージェント並列処理

複数PDFを高速に処理するため、サブエージェントを並列起動する方式を採用。各サブエージェントはhaiku modelで起動し、タイトル取得のみを担当。リネーム処理はメインエージェントが一括で行う。

Running 27 Task agents...
├─ Rename Color0067.pdf · 0 tool uses
│  └─ Initializing...
├─ Rename Color0068.pdf · 0 tool uses
│  └─ Initializing...
...

ポイント:

  • サブエージェントはタイトル取得のみ、リネームは行わない
  • プロジェクト固有コマンド(.claude/commands/)として定義し、許可設定を適用

7. ナンバリング管理

蔵書管理のため、リネーム時にファイル名の先頭に No{番号}_ を付与する仕組みを追加。次回の開始番号はコマンドファイル内で管理し、処理完了後に自動更新される。

Doc0283.pdf → No855_プログラミング入門.pdf
Doc0284.pdf → No856_データベース設計の基礎.pdf

最終的な解決策

スラッシュコマンド /rename-pdf

# PDF タイトルリネームコマンド

## ナンバリング管理
次回の開始番号: No855_

## 手順(サブエージェント並列処理版)

### Step 1: 対象PDFの収集
- ディレクトリなら中の.pdfを全て対象に
- `renamed_``No[0-9]+_` で始まるファイルはスキップ

### Step 2: サブエージェントでタイトル取得(並列実行)
- pymupdfで最初と最後のページを画像抽出
- Claudeの画像認識でタイトルを判断
- 書籍以外(契約書、名簿など)はスキップ

### Step 3: メインエージェントで一括リネーム
- 連番を付けてリネーム
- バックアップ作成

### Step 4: 結果報告

使い方

# 単一ファイル
/rename-pdf C:\Fi7260読み取り\Doc0283.pdf

# ディレクトリ(中のPDF全部)
/rename-pdf C:\Fi7260読み取り

結果報告形式

## 結果報告

### 成功(リネーム完了): 15件

| 元ファイル | 新ファイル名 |
|-----------|-------------|
| Doc0283.pdf | No855_プログラミング入門.pdf |
| Doc0284.pdf | No856_データベース設計の基礎.pdf |

### スキップ(書籍ではない): 3件
- Color0067.pdf: 賃貸借契約書
- Color0068.pdf: 名簿

### 失敗: 1件
- Doc0285.pdf: タイトル抽出失敗

まとめ

  • 当初はPythonスクリプトでテキスト抽出を試みたが、スキャンPDFには不向きだった
  • pymupdfで画像抽出し、Claudeの画像認識でタイトルを判断する方式が最も精度が高い
  • サブエージェント並列処理(haiku model)により、PDF数に関わらず約1-2分で完了
  • ナンバリング管理により蔵書の整理も容易に