請求書PDFファイルをPythonで自動でExcel(.csv)に入力する

,

多くの請求書pdfをExcelに手入力して帳簿を作成したりしてませんか?

今回、自身の経費処理でAmazonの購入履歴を見ていると、適格請求書がダウンロードできることがわかりました。しかしながら、その数が10件以上ともなると手入力では相当な労力を使います。最近はAI-OCRとかで自動読み取りするソフトもあるみたいですが、一枚一枚やるのも大変ですね。また、まだその正確さがわからないので結局チェックは必要となります。

 今回処理したいpdfファイルが32件もあったのでPythonでスクリプトを作ることにしました。コーディングはCo-Pilotに聞きながらすすめたのですが、Co-Pilotは万能ではないのでデバッグは必要でした。サンプルスクリプトを下記に示します。Pythonライブラリはpdfplumberを使用しています。

■サンプルスクリプト (注:サンプルですのであくまで参考です。流用したことによる損害、動作不良については責任を負いません。)

import pdfplumber
import re
import csv
import glob
import os

def extract_invoice_data(pdf_path):

with pdfplumber.open(pdf_path) as pdf:
    text = ""
    for page in pdf.pages:
        page_text = page.extract_text()
        if page_text:
            text += page_text + "\n"
# --- 日付 ---
date_match = re.search(r"請求書発行日\s*(\d{4}-\d{2}-\d{2})", text)
date = date_match.group(1) if date_match else ""
# --- 最後の「合計 税抜 税額 税込」行を抽出 ---
# 例: 合計 ¥1,362 ¥136 ¥1,498
last_total_line = re.findall(
    r"合計\s*[\¥]?\s*([\d,]+)\s*[\¥]?\s*([\d,]+)\s*[\¥]?\s*([\d,]+)",
    text
)
if last_total_line:
    # 最後の合計行を採用
    subtotal = int(last_total_line[-1][0].replace(",", ""))  # 税抜
    tax_amount = int(last_total_line[-1][1].replace(",", ""))  # 税額
    total = int(last_total_line[-1][2].replace(",", ""))  # 税込
else:
    subtotal = 0
    tax_amount = 0
    total = 0
# --- 品名 ---
item_match = re.search(r"(.+?)\s*\|\s*(B[A-Z0-9]{9})", text)
if item_match:
    item = item_match.group(1).strip()
    asin = item_match.group(2).strip()
    item_full = f"{item} | {asin}"
else:
    item_full = "Amazon購入品"
# --- インボイス番号 ---
invoice_match = re.search(r"(T\d{10,13})", text)
invoice_no = invoice_match.group(1) if invoice_match else ""
return {
    "date": date,
    "subtotal": subtotal,
    "tax": tax_amount,
    "total": total,
    "item": item_full,
    "invoice_no": invoice_no,
    "filename": os.path.basename(pdf_path)
}

def create_csv(data_list, output_path=”amazon_import.csv”):

with open(output_path, "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow([
        "日付","借方勘定科目","借方金額","借方税区分",
        "貸方勘定科目","貸方金額","貸方税区分","摘要"
    ])
    for d in data_list:
        writer.writerow([
            d["date"],
            "消耗品費",
            d["subtotal"],
            "課税仕入10%",
            "事業主借",
            d["total"],
            "対象外",
            f"{d['item']}(インボイス {d['invoice_no']} / {d['filename']})"
        ])

— PDFフォルダ内のファイルを処理 —

pdf_files = glob.glob(“amazonpdf/*.pdf”)
results = []
for pdf in pdf_files:
results.append(extract_invoice_data(pdf))
create_csv(results)
print(“CSVファイルを生成しました。”)

正規表現の記述の仕方が難しいのですが、この辺りはCo-Pilotと相談しながら、正しい項目を抽出しているかデバッグしています。(この正規表現を自分で書けと言われても書けません。) amazonpdfというフォルダにまとめて請求書pdfを入れておくことですべてのファイルを処理できます。

■業務効率化の効果

毎日30件のpdf請求書を手入力で処理するとして、手入力だと90分かかるとすると、自動化後は5~10分に短縮できます。 月の実働20日とすると80分x 20日 = 26時間40分/月の工数削減 時給1,500円とすると月30,000円のコスト削減になります。さらにほぼヒューマンエラーが0にできます。

■まとめ

 Pythonは「日常の単純作業(データ入力)の悩み」を確実に解決する。 Pythonのコーディングは難しいイメージがありますがAI(Co-Pilot, ChatGPT, Claude , etc. )の高性能化に伴い、AIと相談しながらコーディング、デバッグすればコーディング自体の工数も削減できます。ただし、もちろんPythonの基礎知識は必要ですし、デバッグについても配慮することが必要となります。また、形式の違うpdfが混ざっている場合は一つのアルゴリズムでは抽出できないので統合処理するには、pdfの種類を定義するなどの必要があるでしょう。

 このように小さな改善を積み重ねて、業務効率を改善し省人化につなげていきましょう。


トップへ戻る