SortPDF
PDF図面の並べ替え作業を支援するWindowsデスクトップアプリケーション。
背景と課題
通信建設の設計業務では、携帯基地局ごとに数十〜数百ページの図面PDFを扱う。図番は図面の種別を表すもので、末尾の番号は作成順に追番される。一方、納品時の並び順には業務固有の慣習があり、図番の昇順とは一致しない。CADソフトでソートしても求める並びにはならない。
結果として、毎回PDFビューアで1ページずつ目視確認しながら手動で並べ替えることになる。自分自身がこの作業に時間を取られていたことが、開発のきっかけになった。
解決アプローチ
OCRによる図番の一括読み取り
PDF上の図枠(タイトルブロック)の位置を一度指定すれば、全ページから図番を一括読み取り。PaddleOCRをONNX Runtimeで組み込んでおり、クラウドAPIへの通信は不要。目視で1ページずつ確認する手間をなくし、並べ替えのスタート地点を作る。
OCR誤読の自動補正
「0とO」「1とI」「2とZ」など、図番特有の誤読パターンをヒューリスティックで自動補正。レーベンシュタイン距離による類似度判定と、文字位置に応じた置換ルールを組み合わせ、補正精度を向上。
ルールベースの大まかなソート
図番の命名規則をパターンマスク(@=英字、#=数字、*=任意)で定義し、ルールに基づいて大まかに並べ替える。ただし、実務で求める並び順は図番の昇順とは限らない。このアプリの自動ソートはあくまで「大枠を整える」ためのもので、最終的な並び順は人が決める前提で設計している。
ドラッグ&ドロップで最終調整
自動ソート後の微調整がこのアプリの本質。サムネイル付きのグリッドビューで全体を俯瞰しながら、ドラッグ&ドロップで直感的に並べ替えられる。複数ページの一括選択・移動・削除・回転にも対応。Undo/Redo付きなので試行錯誤しやすい。
技術的な意思決定
Tauri(Rust) を選択。Electronと比較して、バイナリサイズが小さく起動が速い。PDF操作とOCR推論をRustのネイティブコードで実行するため、数百ページのPDFでも快適に動作。図面データは機密性が高いため、すべての処理をローカルで完結させる設計が必須だった。
PaddleOCR + ONNX Runtime をOCRエンジンに採用。TesseractよりもCJK文字の認識精度が高く、ONNXフォーマットにより追加のPythonランタイムが不要。アプリに組み込んでオフラインで動作。
lopdf でPDF操作。ページの抽出・並べ替え・複数PDFの統合時にオブジェクトIDを再マッピングし、PDF構造の整合性を維持。壊れたPDFの自動修復機能も実装。
フロントエンドはNext.js Static Export をTauriのWebViewで表示。pdfjs-distでサムネイル描画、@dnd-kitでドラッグ&ドロップUIを実装。Rustバックエンドとは18個の非同期コマンドで通信。
技術スタック
- デスクトップ: Tauri 2.10 (Rust)
- PDF操作: lopdf
- OCR: PaddleOCR (ONNX Runtime)
- フロントエンド: Next.js 16, TypeScript, Tailwind CSS
- PDF描画: pdfjs-dist
- ドラッグ&ドロップ: @dnd-kit
- 並列処理: rayon
- 配布: NSIS/MSIインストーラー
