toriR blog
確定申告用に領収書のファイル名をAIに作らせててみた
OCRでテキストを抽出し、Gemini AIに推定させることで、領収書のファイル名を自動生成する仕組みを作りました。🤖✨ 🚀 ポイント ✅ PDFを画像に変換&OCRでテキスト抽出 ✅ AIで日付・支払先・金額を解析 ✅ YYY-MM-DD_支払額_支払い先.jpg の形式でリネーム ✅ 並列処理で高速化&バックアップ機能付き
揺らぎのある文字列の意味解釈はGemini AIにやってもらうのがポイント
- pythonでOCRして、テキストデータからファイル名を生成しようと思ったのだけど、書き方が各店各様なので、個別の指示が膨大になり断念。2時間あれこれしてしまいました。ちょっと立ち止まって考えたら生成AIに推定させたらいいんじゃない?と思いついて、さがしたらこの記事を見つけた次第。
- こちらの記事からヒントを得て、openAIのAPIでなく、Google Gemini AI APIを使ってみました。感謝感謝!!!
- ここでopenAIは無料訳なのでかAPIを見つけられなかったので、よく使っているGoogleのサービスを使うことにしました。でもやたらとセキュリティーが厳しくてドキュメントが多すぎる。
- そこでこれらもAIに聞きながら作業したらできました。
- プログラムはcursor + chatGPTを使って、スクラチビルドです。これが本当に効率がいい。
- ある程度エラー処理も追加しました。
- 個人用なので不具合があるかも。
コードはこちら
ライセンス:MIT
方針
- 完璧は目指さない
- ファイル名は YYYーMM-DD_支払額_支払い先.jpgとしました
考え方
- Gemini AI APIの取得 (ここが難しそうなので最後に書いてます)
- ローカルでの処理:
- PDFファイルをJPEGに変換
- 画像ファイルのBase64エンコード
- ファイル名の生成と重複チェック
- バックアップの作成
- ログファイルの管理
- 並列処理の制御
- Gemini AIの処理:
- 画像からのテキスト抽出
- 日付の解析と西暦変換
- 支払先の正規化
- 金額の抽出
- 摘要の抽出
- 複数ページの結合処理
- 領収書の情報抽出における課題
- 店舗ごとに異なるフォーマット
- 和暦と西暦の混在
- 支払日の表記ゆれ(発行日、利用日、支払日など)
- 複数ページにわたる情報
- 生成AIの活用
- 柔軟なテキスト解釈
- 文脈を考慮した情報抽出
- 複数の表記形式への対応
- 処理の流れ
- 画像/PDFの読み込み
- OCRによるテキスト抽出
- Gemini AIによる情報の構造化
- ファイル名の生成と変更
- エラー処理とバックアップ
- 元ファイルの自動バックアップ
- 処理失敗時のログ記録
- 重複ファイル名の処理
実装のポイント
PDFの全ページ処理
def pdf_to_jpeg(pdf_path, temp_dir, logger): """PDFの全ページをJPEGに変換""" = convert_from_path(pdf_path) images = [] jpeg_paths for i, image in enumerate(images): = os.path.join(temp_dir, f"page_{i+1}.jpg") jpeg_path 'JPEG') image.save(jpeg_path, jpeg_paths.append(jpeg_path)return jpeg_paths
和暦の自動変換
# 和暦変換ルール - 令和元年 = 2019年 - 令和2年 = 2020年 - 令和3年 = 2021年 - 令和4年 = 2022年 - 令和5年 = 2023年 - 令和6年 = 2024年 - 令和7年 = 2025年
日付の優先順位
1) 宿泊サービスの場合は宿泊最終日を支払日とする 2) 支払済印の日付 3) 領収印の日付 4) 取引日/利用日 5) 発行日
並列処理による高速化
= min(multiprocessing.cpu_count(), len(valid_files)) max_workers with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: = [executor.submit(process_file, file, args, logger, backup_dir) futures for file in valid_files]
ファイル名の生成規則
= f"{date_formatted}_{amount}円_{company_name}" new_filename_base # 例:2024-03-23_7440円_一休
使用上の注意点
APIキーの設定
~/.google_AI_API
ファイルにAPIキーを保存- フォーマット:
GOOGLE_API_KEY=あなたのAPIキー
対応ファイル形式
- JPEG (.jpg, .jpeg)
- PNG (.png)
- PDF (.pdf)
バックアップについて
- 処理前に自動的にバックアップを作成
- バックアップディレクトリ名:
backup_YYYYMMDD_HHMMSS
年の指定
# 特定の年のみ処理 ./receipt_rename.py -y 2024 -- *.jpg # 複数年を指定 ./receipt_rename.py --year 2024 2025 -- *.jpg