はじめに
自動車やオートバイなど、車両を多く管理する必要のある企業(中古車販売事業や運送業など)にとって、車両や顧客の管理は必須かと思います。今回はClaudeやCodexのCLIをVS Codeから呼び出して、運用フローやサーバー仕様などを定義し、バイブコーディングでシステムを開発してみました。サーバー環境はAWSでDocker Containerベース、ECS/Lambda/Lightsailなどに対応し、DBはPostgreSQLです(今回は簡易的にLightsail)。
本記事では、実装した「車両管理システム」の機能要件・フロー・仕様をまとめます。コードはDjango 4.2 + Django REST Frameworkで、PDF読み取りに pdfplumber、不足時は pytesseract でOCRフォールバックしています。
完成ページスクリーンショット
機能要件一覧(抜粋)
- 車検証PDFを入力(Web UIアップロード/REST API/フォルダ投入/管理コマンド)し、テキスト抽出→項目解析を自動実行
-
pdfplumberで抽出し、テキスト量が足りなければpytesseract(日本語+英語)でOCRフォールバック - 抽出結果を
VehicleInspectionとしてDB保存、元PDFはmedia/inspection_pdfs/%Y/%m/%d/に保管 - 抽出状態を
pending/processing/completed/failedで管理し、失敗時はメモ保持 - 抽出・格納対象(例): 登録番号、車名/型式/原動機型式、種別/用途/自家用・事業用、車体形状、乗車定員、最大積載量、重量・寸法・軸重、型式指定番号・類別区分番号、総排気量/出力、燃料、走行距離計(現行/旧)、所有者/使用者/所在地、使用本拠位置、登録日・初度登録年月・車検有効期限、税額、受検種別/形態/点検整備状況、備考 など
- Web UI: 一覧/詳細/編集/削除/再処理、検索(登録番号/所有者/車名)、ステータス絞り込み、ページネーション
- REST API(認証必須): CRUD、フォルダ一括処理、再処理、統計取得
- バッチ/監視:
process_pdfsで一括処理、watch_folderでフォルダ監視→自動処理・処理済み移動 - 環境変数でDB・CORS・PDFフォルダ・AWS設定・SECRET_KEY/DEBUG/ALLOWED_HOSTSを切替可能
- Docker/Compose & AWS(ECS/EB/Lightsailコンテナ)デプロイ対応、ヘルスチェック
/health/を提供
システムフロー
1. PDF投入〜登録(Web/UI・API)
-
/upload/でドラッグ&ドロップ orPOST /api/vehicles/にPDF送信 -
VehicleInspectionをextraction_status=processingで生成し、PDFを保存 -
pdfplumber→必要に応じOCRで抽出、正規表現で項目解析 - 解析結果を保存し
completedに。例外時はfailedとメモ - Web/UI・APIから閲覧/編集/削除/再処理が可能
2. フォルダ監視・バッチ
- 監視フォルダ(
PDF_WATCH_FOLDER既定./pdf_input)にPDF配置 -
watch_folderが生成検知→自動処理 - 成功時はDB登録し処理済みフォルダ(
PDF_PROCESSED_FOLDER既定./pdf_processed)へ移動 - 失敗はカウント&ログ、同名PDFが既存ならスキップ
- 手動一括は
process_pdfs [--folder <path>]
3. API
-
GET /api/vehicles/一覧(20件/ページ) -
GET /api/vehicles/{id}/詳細、PUT/PATCH更新、DELETE削除 -
POST /api/vehicles/{id}/reprocess/再処理 -
POST /api/vehicles/process_folder/フォルダ一括処理 -
GET /api/vehicles/stats/件数ステータス -
GET /health/DBヘルスチェック - 標準でDRF認証必須、CORSは環境変数で許可
仕様書(ポイント)
技術スタック
- Django 4.2 + Django REST Framework
- DB: SQLite(開発デフォルト)/ PostgreSQL(本番想定)
- PDF処理:
pdfplumber、OCR:pytesseract - 監視:
watchdog - デプロイ: Docker/Compose、AWS(ECS/EB/Lightsailコンテナ)
環境変数(例)
-
SECRET_KEY(必須),DEBUG,ALLOWED_HOSTS - DB:
USE_SQLITE,DB_NAME,DB_USER,DB_PASSWORD,DB_HOST,DB_PORT - CORS:
CORS_ALLOWED_ORIGINS,CORS_ALLOW_ALL_ORIGINS - PDF:
PDF_WATCH_FOLDER,PDF_PROCESSED_FOLDER - AWS:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_STORAGE_BUCKET_NAME,AWS_S3_REGION_NAME - 言語/タイムゾーン:
ja,Asia/Tokyo
データモデル(主要フィールド)
- 登録番号、登録日/初度登録、車名/型式/原動機型式、種別/用途/自家用・事業用、車体形状、乗車定員、最大積載量、重量・寸法・軸重、型式指定番号、類別区分番号、総排気量/出力、燃料
- 走行距離計(現行/旧)、所有者/使用者/住所、使用本拠位置、車検日/有効期限、税額、受検情報、備考
- PDFファイル、抽出テキスト、
extraction_status、extraction_notes、作成/更新日時
PDF処理
- PDF保存→
pdfplumberで抽出、不足時OCR(lang='jpn+eng'、失敗時英語のみ) - 正規表現で項目解析(和暦→西暦変換含む)
- 成功で
completed、例外でfailed+ メモ - 一括処理時、既存ファイル名はスキップ、成功PDFは処理済みフォルダへ移動
Web UI
-
/upload/: ドラッグ&ドロップ、簡易プログレス、件数サマリ -
/vehicles/: 一覧(検索・ステータス絞り込み・ページネーション) -
/vehicles/<id>/: 詳細/編集/削除/再処理
運用・セキュリティ
- REST APIのデフォルト権限は
IsAuthenticated - ALLOWED_HOSTS/CORSは環境変数で設定、DEBUG=Falseで各種セキュリティヘッダー有効
- Tesseract未インストール時は警告し、OCR無しで継続
-
/health/で監視
管理コマンド
-
python manage.py process_pdfs [--folder <path>]一括処理 -
python manage.py watch_folder [--folder <path>]監視→自動処理
触ってみる(ローカル例)
git clone <repository-url>
cd 車両管理システム
python -m venv venv
venv\Scripts\activate # Windows の場合
pip install -r requirements.txt
cp env.example .env # SECRET_KEYやDBを設定
python manage.py migrate
python manage.py runserver
# ブラウザで http://localhost:8000/upload/ へアクセス
Docker Compose利用の場合:
docker-compose up -d
docker-compose exec web python manage.py migrate
docker-compose exec web python manage.py createsuperuser
まとめ
- PDF→テキスト→正規表現解析→DB保存を一気通貫で自動化し、Web UI/DRF API/管理コマンドの複数入口を用意
- OCRフォールバックで読み取り品質を担保しつつ、失敗メモと再処理導線を確保
- 環境変数とDocker/AWS対応でデプロイを簡素化
車検証の入力オペレーションを自動化したい方の参考になれば幸いです。質問や改善アイデアがあればぜひコメントください。


