請求書PDFの一覧Excel化とリネーム手順

概要

invoices フォルダ内の請求書PDFを読み取り、1請求書=1行のサマリーExcelを作成し、さらに元PDFを YYYY-MM-DD_{請求元会社名}.pdf 形式で別フォルダにコピーする一連の手順。

支払管理・振込作業向けの「一覧表」を作るのが目的。品目明細まで展開する場合は別記事「請求書PDFをExcelにまとめる手順」を参照。

フロー図

前提

  • 請求書PDFは接続フォルダ配下の invoices/ にある(例: ~/mnt/demo/invoices/)。
  • PDFはテキストレイヤーを持つ(スキャン画像の場合はOCRが必要)。
  • 各社でレイアウトはバラバラ(縦書き風・英日混在・表形式など)だが、記載項目は共通。
  • 作業はユーザーのPC上で device_bash を使って実行する。ファイルをコンテナへアップロードしない。

手順

1. PDFの一覧化とテキスト抽出

cd $HOME/mnt/demo/invoices
for f in *.pdf; do echo "=== $f"; pdftotext -layout "$f" -; done
  • -layout を必ず付ける。表組みの列関係が崩れず、単価・金額の対応を読み違えない。
  • ユーザーPCに pdftotext / openpyxl / soffice が入っているか事前に which で確認する。

2. 抽出する項目

項目

備考

発行日

「発行日」「ISSUED」「Issued」表記ゆれあり

支払い期限

「お支払期限」「DUE」「支払期限」表記ゆれあり

請求元

請求先(クローバ株式会社)と取り違えないこと

請求元住所

郵便番号+住所+ビル名・階まで

登録番号

インボイス制度の適格請求書発行事業者登録番号(T+13桁)

請求額

税込の合計金額。小計(税抜)と混同しない

振込先

銀行名・支店・口座種別・口座番号・口座名義をそのまま転記

3. Excelの作成

  • xlsx スキルをRead して作成ルール(フォント統一、数式使用、ゼロエラー)を確認する。
  • openpyxl でワークブックを作成:
    • 列順は 発行日 / 支払い期限 / 請求元 / 請求元住所 / 登録番号 / 請求額 / 振込先。
    • 発行日の昇順でソート(同日は請求元名で安定ソート)。
    • 日付は datetime.date で書き込み、表示形式 yyyy/mm/dd。文字列で入れない。
    • 請求額は数値で書き込み、表示形式 #,##0。
    • ヘッダーは太字・白文字・濃紺背景(1F4E79)、freeze_panes="A2"、auto_filter を設定。
    • 最終行に合計行を置き、=SUM(F2:F11) のようにExcel数式で集計する(Python側で計算した値をハードコードしない)。
    • 末尾に出典・前提の注記行を入れる。
  • 列幅の目安: 発行日/支払期限 12、請求元 32、住所 58、登録番号 18、請求額 14、振込先 52。

4. 数式の再計算と検算

openpyxl が書いた数式にはキャッシュ値が無いため、そのままではプレビューで空欄に見える。LibreOffice で再計算して上書きする。

cd $HOME && mkdir -p recalc && cp mnt/demo/請求書一覧.xlsx recalc/ && cd recalc
soffice --headless --norestore -env:UserInstallation=file://$HOME/lo_profile \
--convert-to xlsx --outdir out 請求書一覧.xlsx
cp out/請求書一覧.xlsx $HOME/mnt/demo/請求書一覧.xlsx
  • -env:UserInstallation を指定しないと、ユーザーが起動中のLibreOfficeとプロファイルが競合して失敗する。
  • 変換後に data_only=True で読み直し、全行の値と合計が元PDFと一致するか確認する。
  • 作業用の recalc/ と lo_profile/ は最後に削除する。ユーザーの接続フォルダに一時ファイルを残さない(作業用ファイルは $HOME 直下=mnt/ の外に置く)。

5. PDFのリネームコピー

cd $HOME/mnt/demo && mkdir -p invoices_renamed
# 抽出済みの発行日と請求元名から {元ファイル名: 新ファイル名} の対応表を作り
# shutil.copy2 で invoices_renamed/ へコピー
  • ファイル名フォーマットは YYYY-MM-DD_{請求元会社名}.pdf。
  • 元ファイルは残し、コピーで作成する(device_bash はデフォルトで削除不可のため、移動ではなくコピーが安全)。
  • コピー前に元ファイルの存在を assert で確認し、コピー後に件数と一覧を検証する。
  • 会社名はPDF記載どおり(株式会社/有限会社/合同会社 を省略しない)。

6. 報告

  • 保存先フォルダ名とファイル名を伝える(接続フォルダに直接書いた成果物はそれ自体が納品なので、チャットへの再送は不要)。
  • 件数・合計金額・気づいた点(口座種別が「当座」の1件だけ違う、支払期限が1件だけ翌月、など)を簡潔に添える。

注意点

  • 請求額は必ず税込合計。「小計(10%対象)」を拾わないよう、消費税額を足した値と突合する。
  • 発行日が同一の請求書が複数ある場合、ファイル名は重複しないが並び順は不定になる。必要なら請求書番号を付与する。
  • ユーザーの接続フォルダ内のファイルは device_bash から削除できない。やり直す場合は上書き保存するか、別名で作成する。
  • 成果物のフォントは Arial などのプロフェッショナルフォントで統一する。
最終更新: