diff --git a/PythonProj/ScanOCR/README.md b/PythonProj/ScanOCR/README.md index b60c2198..5b66f6d6 100644 --- a/PythonProj/ScanOCR/README.md +++ b/PythonProj/ScanOCR/README.md @@ -1,59 +1,66 @@ -# PDF氏名・日付抽出&リネームツール +# PDFスキャン監視・自動振り分けツール -テンプレート画像(赤枠=氏名欄、青枠=日付欄)を基準に、対象フォルダ内のPDFから -氏名・日付をOCRで抽出し、リネーム・振り分けを行うスクリプトです。 - -## セットアップ - -```bash -pip install opencv-python pdf2image pytesseract pillow numpy -``` - -システムに以下が必要です(Ubuntu/Debianの例): -```bash -sudo apt-get install tesseract-ocr tesseract-ocr-jpn poppler-utils -``` +テンプレート画像(赤枠=氏名欄、青枠=日付欄)を基準に、"スキャン"フォルダ内のPDFから +氏名・日付をOCRで抽出し、リネーム・振り分けを行うツールです。 ## 使い方 -1. テンプレート画像を用意する - - 実際の書類(1枚)をスキャン、または元PDFをそのまま画像化 - - 画像編集ソフトなどで、氏名が書かれている位置に赤い四角枠、日付が書かれている位置に青い四角枠を重ねて保存(PNG推奨) - - **重要**: テンプレートは実際の対象PDFと同じ用紙サイズ・向きで作成してください(比率で位置を計算するため、多少の解像度差は自動補正されます) +1. `config.txt` で各フォルダ名・動作パラメータを確認(通常は初期値のまま利用可) +2. `テンプレート/` フォルダにテンプレート画像を1つ入れる(複数ある場合はファイル名が最も早いもの) + - 画像編集ソフト等で、氏名欄に赤い四角枠、日付欄に青い四角枠を重ねて保存(PNG推奨) + - テンプレートは実際の対象PDFと同じ用紙サイズ・向きで作成すること +3. `スキャン/` フォルダに処理対象PDFを入れる +4. `OCR仕分け実行.bat` をダブルクリック +5. 処理結果は以下に振り分けられる: + - 成功: `アウトプット/氏名/氏名_YYYYMMDD.pdf` にコピー、元ファイルは `成功/` へ移動 + - 失敗: `失敗/` フォルダへ元ファイルのまま移動 +6. 実行ログは `ログ/YYYY-MM-DD.log` に記録される +7. 処理を途中で止めたい場合は、コンソールが表示されている間に何かキーを押す(1件処理する度にチェックされる) -2. フォルダを準備する - - `input/` … 処理対象のPDFを入れる - - `output/` … 成功時、氏名ごとのサブフォルダに `YYYYMMDD_氏名.pdf` として保存される - - `failed/` … 抽出に失敗したPDFがそのまま退避される(要目視確認) +## フォルダ構成 -3. 実行する - -```bash -python extract_and_rename.py \ - --template template.png \ - --input ./input \ - --output ./output \ - --failed ./failed \ - --margin 0.10 +``` +ScanOCR/ +├── OCR仕分け実行.bat 起動バッチ +├── config.txt フォルダ名・動作パラメータ設定(必須ファイル) +├── スクリプト/ +│ ├── extract_and_rename.py メイン処理 +│ ├── box_detector.py テンプレート枠検出 +│ ├── config_loader.py config.txt読込 +│ ├── file_ops.py ファイル名衝突回避コピー・移動、安定待ち +│ ├── lock_manager.py 二重起動防止ロック +│ ├── logger.py 実行ログ出力 +│ ├── python/ Python embeddable本体(配布パッケージのみ) +│ └── tools/ tesseract-ocr・poppler(配布パッケージのみ) +├── テンプレート/ +├── スキャン/ +├── アウトプット/ +├── 成功/ +├── 失敗/ +└── ログ/ ``` -`--margin` は枠位置の許容誤差率です。0.10 = 上下左右に枠の幅・高さの10%分だけ -広げた範囲までOCR対象とします(スキャン時の位置ズレ対策)。 +## 開発者向け(配布パッケージのビルド) + +配布用の同梱Python・tesseract・popplerは `build/build_package.py` で自動生成します。 +`dist/ScanOCR/` 配下に配布用一式が生成されます。ネットワーク接続必須、7-Zip(`7z`コマンド)が +PATHに通っている必要があります。実行には数分〜数十分かかります。 + +```bash +python build/build_package.py +``` + +## 開発者向け(テスト実行) + +```bash +python -m pip install pytest +python -m pytest スクリプト/tests -v +``` ## 注意点 -- OCRは完璧ではありません。特に手書きに近い字体、かすれ、低解像度スキャンでは - 誤読が発生します。`output/` の結果は初回運用時に必ず目視確認してください。 -- 日付の年が2桁(例: 26/08/02)の場合、スクリプトは "20XX年" と仮定して補完します。 - 昭和・平成表記など和暦が使われる書類の場合は `clean_date()` 関数の調整が必要です。 -- 複数ページPDFの場合、現在は1ページ目のみを対象にしています。 -- 氏名に同姓同名がいる場合や、同じ氏名で複数回書類が発行される場合、ファイル名の - 衝突は自動的に連番(_1, _2...)で回避されます。 -- テンプレートで検出される枠は「最大面積の赤/青矩形」を採用しています。枠線以外に - 赤・青の要素(ロゴなど)がテンプレート内にあると誤検出する可能性があるため、 - テンプレートはできるだけシンプルな見た目にしてください。 - -## ファイル構成 - -- `box_detector.py` … テンプレートから赤枠・青枠の位置を検出するモジュール -- `extract_and_rename.py` … メイン処理(OCR抽出・リネーム・移動) +- OCRは完璧ではありません。運用初期は `アウトプット/` の結果を必ず目視確認してください +- 日付の年が2桁の場合は "20XX年" と仮定して補完します。和暦は非対応です +- 複数ページPDFは1ページ目のみ対象です +- ファイル名衝突時は `氏名_YYYYMMDD(2).pdf` のように連番が付与されます +- `config.txt` は必須ファイルです。存在しない場合は起動時にエラーになります diff --git a/PythonProj/ScanOCR/config.txt b/PythonProj/ScanOCR/config.txt new file mode 100644 index 00000000..f93a84d5 --- /dev/null +++ b/PythonProj/ScanOCR/config.txt @@ -0,0 +1,11 @@ +スクリプトフォルダ=スクリプト +テンプレートフォルダ=テンプレート +スキャンフォルダ=スキャン +アウトプットフォルダ=アウトプット +成功フォルダ=成功 +失敗フォルダ=失敗 +ログフォルダ=ログ +margin=0.10 +DPI=300 +ファイル安定待ち秒=1 +ファイル安定待ちリトライ回数=5