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を使って、スクラチビルドです。これが本当に効率がいい。
  • ある程度エラー処理も追加しました。
  • 個人用なので不具合があるかも。

コードはこちら

方針

  • 完璧は目指さない
  • ファイル名は YYYーMM-DD_支払額_支払い先.jpgとしました

考え方

  1. Gemini AI APIの取得 (ここが難しそうなので最後に書いてます)
  2. ローカルでの処理:
    • PDFファイルをJPEGに変換
    • 画像ファイルのBase64エンコード
    • ファイル名の生成と重複チェック
    • バックアップの作成
    • ログファイルの管理
    • 並列処理の制御
  3. Gemini AIの処理:
    • 画像からのテキスト抽出
    • 日付の解析と西暦変換
    • 支払先の正規化
    • 金額の抽出
    • 摘要の抽出
    • 複数ページの結合処理
  4. 領収書の情報抽出における課題
    • 店舗ごとに異なるフォーマット
    • 和暦と西暦の混在
    • 支払日の表記ゆれ(発行日、利用日、支払日など)
    • 複数ページにわたる情報
  5. 生成AIの活用
    • 柔軟なテキスト解釈
    • 文脈を考慮した情報抽出
    • 複数の表記形式への対応
  6. 処理の流れ
    • 画像/PDFの読み込み
    • OCRによるテキスト抽出
    • Gemini AIによる情報の構造化
    • ファイル名の生成と変更
  7. エラー処理とバックアップ
    • 元ファイルの自動バックアップ
    • 処理失敗時のログ記録
    • 重複ファイル名の処理

実装のポイント

  1. PDFの全ページ処理

    def pdf_to_jpeg(pdf_path, temp_dir, logger):
        """PDFの全ページをJPEGに変換"""
        images = convert_from_path(pdf_path)
        jpeg_paths = []
        for i, image in enumerate(images):
            jpeg_path = os.path.join(temp_dir, f"page_{i+1}.jpg")
            image.save(jpeg_path, 'JPEG')
            jpeg_paths.append(jpeg_path)
        return jpeg_paths
  2. 和暦の自動変換

    # 和暦変換ルール
    - 令和元年 = 2019
    - 令和2 = 2020
    - 令和3 = 2021
    - 令和4 = 2022
    - 令和5 = 2023
    - 令和6 = 2024
    - 令和7 = 2025
  3. 日付の優先順位

    1) 宿泊サービスの場合は宿泊最終日を支払日とする
    2) 支払済印の日付
    3) 領収印の日付
    4) 取引日/利用日
    5) 発行日
  4. 並列処理による高速化

    max_workers = min(multiprocessing.cpu_count(), len(valid_files))
    with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = [executor.submit(process_file, file, args, logger, backup_dir) 
                  for file in valid_files]
  5. ファイル名の生成規則

    new_filename_base = f"{date_formatted}_{amount}円_{company_name}"
    # 例:2024-03-23_7440円_一休

使用上の注意点

  1. APIキーの設定

    • ~/.google_AI_APIファイルにAPIキーを保存
    • フォーマット:GOOGLE_API_KEY=あなたのAPIキー
  2. 対応ファイル形式

    • JPEG (.jpg, .jpeg)
    • PNG (.png)
    • PDF (.pdf)
  3. バックアップについて

    • 処理前に自動的にバックアップを作成
    • バックアップディレクトリ名:backup_YYYYMMDD_HHMMSS
  4. 年の指定

    # 特定の年のみ処理
    ./receipt_rename.py -y 2024 -- *.jpg
    
    # 複数年を指定
    ./receipt_rename.py --year 2024 2025 -- *.jpg

Article Info

created: 2025-03-05 05:30:26
modified: 2025-03-05 16:39:30
views: 218
keywords: OCR 確定申告 領収書 生成AI Gemini

Articles