1. 試したこと:PDFから確認用のCSV候補を作る

受け取った請求書を会計ソフトへ転記する前に、日付・取引先・税込金額を一覧にする工程を試しました。経理AIの記事が業務全体の進め方を説明するのに対し、今回は実際に動かした小さな変換処理と、失敗した点を示します。

Pythonの標準ライブラリと、手元にある文字抽出コマンド pdftotext を使いました。有料API・認証情報・実運用データは使っていません。AIは試作を作る補助に使い、請求書の勘定科目や税区分を推測させませんでした。

PDFには、請求番号、架空の取引先、取引日、品目、税抜金額、税率、税込合計を配置しました。すべて簡略化した試作用書類です。登録番号など適格請求書の全記載事項を備えた帳票ではなく、制度対応を確かめたものでもありません。

2. 作り方の要点:原本の項目と出力先を分ける

freeeの公開ヘルプと添付CSVを参考に、同じ列名の候補ファイルを作りました。今回の抜粋は次の対応です。実際の出力は公式サンプルの21列を保ち、使わない列は空欄にしました。他の会計ソフトへ流用する際は、取り込み形式を確認し直します。

PDFの項目 CSVの列 今回の扱い
取引日 発生日 2026/10/01 のような日付。請求日を自動で取引日に置き換えない
請求番号 管理番号 LAB-001 など、架空の番号を保持
取引先 取引先 架空の名称を保持。実運用では登録済み名称・コードと照合
税込合計 金額 税抜金額ではなく、原本の税込合計を採用
原本だけでは決まらない項目 勘定科目・税区分 空欄。担当者の判断を必要とする
支払状況 決済日・決済口座・決済金額 今回は空欄。支払済みとは判断しない

手順は、PDFから文字を取り出す、項目名で値を拾う、保留条件を調べる、CSV候補と保留一覧を別々に保存する、の順です。出力文字コードは公式サンプルと同じUTF-8 BOM付きにしました。

pdftotext -layout 請求書.pdf -

修正した処理の要点は、金額の意味を明示して、不明な行を出力候補から外すことです。次は試作コードの抜粋で、単独で動くプログラムではありません。

amount = field('税込合計')
key = (supplier, number)
if not all([number, supplier, date, amount]):
    reason = '必須項目不足'
elif key in seen:
    reason = '同一取引先・請求番号の再送'
elif field('税率') != '10%':
    reason = '試作対象外の税率構成'

field は抽出した文字から項目名に対応する値を拾う処理です。今回の同じ配置のPDFに合わせたもので、どんな請求書にも使える読み取り機能ではありません。

3. 結果:候補2行、保留3件になった

同じ配置の1ページPDF5ファイルを、ファイル名順に一度ずつ処理しました。下表の金額・番号・名称はすべて架空です。抽出した税込合計と出力候補をAIが照合し、保留一覧の理由を確認しました。人による照合や会計ソフト上の受け入れ確認は含みません。

入力 原本の税込合計 最初の出力金額 修正後
LAB-001/架空ラボ商会A 11,000円 10,000円 11,000円の候補
LAB-002/架空ラボ商会B 22,000円 20,000円 22,000円の候補
LAB-001の再送 11,000円 10,000円 同一取引先・請求番号として保留
LAB-004/架空ラボ商会C 記載なし 30,000円 必須項目不足として保留
LAB-005/架空ラボ商会D 16,400円 15,000円 10%・8%の混在を対象外として保留

最初は5行を出力し、保留は0件でした。修正後は候補2行、保留3件です。これは意図を決めて作った5ファイルでの観測であり、実際の請求書の読み取り精度や、業務時間の削減率ではありません。

修正後の処理時間は、今回のmacOS環境で1回実行したところ約0.075秒でした。Pythonの perf_counter で、公式サンプルの列名の読み込みから、5ファイルの文字抽出・候補CSVと保留一覧の保存までを測りました。Pythonの起動、PDFの作成、コードの準備、原本照合、人による判断、会計ソフトへの登録は含みません。pdftotext は26.03.0です。小さな同一書式での値なので、実業務の所要時間として使えません。

試作の準備開始から、PDF作成・最初の実行・修正後の実行・出力の確認までの経過時間は2分59秒でした。開始・終了の時計で記録した、このAIによる小さな試作の時間です。先行する資料調査、記事制作、表示確認、経理担当者の作業は含まず、人が同じものを作る時間の目安ではありません。

候補ファイルの主な列を抜き出すと、次の内容になりました。必須項目の勘定科目・税区分が未入力なので、この段階で取り込みには進みません。

管理番号 発生日 取引先 金額 勘定科目・税区分
LAB-001 2026/10/01 架空ラボ商会A 11000 空欄・要確認
LAB-002 2026/10/01 架空ラボ商会B 22000 空欄・要確認

4. うまくいかなかったことと、直したこと

文字を取り出せても、項目と値が離れた

最初に通常の文字抽出をしたところ、項目名と値の間に改行が入りました。配置を保つ -layout を指定すると、今回のPDFでは同じ行から値を拾えました。別の書式や段組みでも同じ結果になるとは限りません。文字抽出が空になるスキャンPDFのOCRは、今回試していません。

「金額」だけで探すと、税抜金額を拾った

最初のコードは「金額」に続く数字を探し、先に現れる「税抜金額」を採用していました。そのため、税込合計がない書類まで候補に入りました。修正では「税込合計」の項目を指定し、なければ推測で埋めず保留にしました。原本の合計とCSVの金額を照合する必要があります。

再送と複数税率を、通常の行と同じ扱いにしていた

修正では、同一の取引先・請求番号が処理内で再び出たら保留にしました。ただし、別の日に実行した履歴や会計ソフトの登録済み取引とは照合していません。同じ番号の訂正版も自動で置き換えず、人が判断する必要があります。

税率が混在する書類は、合計金額だけでは内訳を表せないため、今回の1行出力の対象外にしました。国税庁の概要資料でも税率ごとの対価・税額が記載事項として示されています。実運用では税率別の金額、端数、科目などを確認して形式を設計します。今回の条件判定は税務上の適否を判定するものではありません。

5. 実際の業務で使う前に確認すること

  1. 対象の書式:文字抽出できるか、項目名や配置が違うか、複数ページ・明細・値引きがあるかを確認します。不明な値を自動で埋めない方針を決めます。
  2. 原本との照合:経理担当者が取引先、取引日、税込合計、税率別の内訳、勘定科目・税区分を確認します。登録番号や保存要件の確認は別途必要です。
  3. 出力先の条件:最新の公式テンプレート、文字コード、必須項目、登録済み名称を確認します。今回の候補CSVが受け入れられるかは未確認です。
  4. 二重登録の防止:処理内だけでなく過去の受付・承認・登録履歴と照合します。成功済みの行を再取り込みせず、訂正・取消の扱いも決めます。
  5. 承認とデータの扱い:誰が保留を解消し、承認して登録するかを決めます。実際の書類を外部AIへ渡す前に社内ルール・契約を確認します。今回の試作には自動送信も自動登録もありません。

まずは一つの書式で「候補を作る」「保留を出す」「人が照合する」を分けると、次に直す箇所を整理できます。実際の取引を入力する前の判断は、顧客情報を生成AIへ入力する前の確認も参考にしてください。

6. 転記で困っている箇所から相談する

今回分かったのは、決まった書式から候補CSVを作れても、金額の意味と例外の扱いを決めないと誤った行が出ることです。支払状況・税務判断・登録は、この試作だけでは完結しません。

「請求書から一覧を作りたい」「再送を見分けたい」といった一工程から、対象と確認担当を整理できます。経理業務の支援とサービス・料金をご覧のうえ、今の作業について無料相談でお知らせください。