請求書・納品書PDFの自動生成 — 帳票をコードで作る

テンプレート依存から脱却し、請求書・納品書PDFをコードで生成。日本語対応から保管まで

請求書PDF生成pdf-lib帳票自動化
読了時間: 9分

はじめに

請求書や納品書、あるいはデビットノート(Debit Note)といった帳票を、いまだにExcelやWordのテンプレートに手で数字を打ち込んで作っている——そんな現場は少なくないのではないでしょうか。

私が担当した輸入卸の業務も、まさにそうでした。取引ごとにテンプレートを開き、金額を転記し、PDFに書き出す。数が増えるほど、この作業がボディブローのように効いてきます。

この記事では、そうしたテンプレート運用から脱却し、データから帳票を機械的に生成するアプローチの全体像を解説します。使ったのはpdf-libというJavaScriptのライブラリです。

テンプレート運用の限界

属人化と転記ミス

ExcelやWordのテンプレート運用は、始めるのは簡単です。ですが続けていくと、じわじわと問題が溜まっていきます。

一番怖いのが転記ミスです。金額のセルを一つずらして貼り付けた、消費税の計算式が壊れていた、宛先の会社名が前の取引先のまま残っていた——こうしたミスは、帳票という「お金の書類」では致命的です。

そしてもう一つが属人化。「あのファイルの触り方はあの人しか分からない」という状態は、担当者が休んだ瞬間に業務を止めてしまいます。

コピー運用が生む「地層」

テンプレート運用のもう一つの罠が、ファイルのコピーが際限なく増えていくことです。

テンプレート運用 vs コード生成
BEFORE
テンプレートをコピーして作る

取引ごとにファイルが増殖。どれが最新版か分からなくなり、古い書式のまま送ってしまう事故も

脱却
AFTER
データから毎回生成する

帳票の実体はデータ。書式はコード側に一元化され、常に同じ品質の帳票が出力される

「先月のあの請求書をベースに…」とコピーを重ねていくと、書式のバージョンがバラバラの「地層」ができあがります。ここから抜け出すには、発想を変える必要がありました。

コードで帳票を生成する発想

「書式」と「データ」を分ける

このアプローチの核心は、帳票を「書式」と「データ」に分けて考えることです。

Excelのテンプレートは、書式とデータがひとつのファイルに混ざっています。だから触るたびに壊れるリスクがあります。一方、コード生成では書式はコード(レイアウトの定義)に、データはデータベースに、それぞれ分かれて存在します。

帳票を作るときは、この2つを合成してPDFを吐き出すだけ。書式を直したいなら、コードを1箇所直せば、以降すべての帳票に反映されます。ここが手作業運用との決定的な違いなんです。

pdf-libで描画する

具体的な生成にはpdf-libを使いました。これはブラウザでもサーバー(Node.js)でも動く、PDFを直接組み立てられるライブラリです。

帳票生成の処理フロー
データを集める

取引データ・明細(SKU・数量・単価)・宛先情報を用意する

レイアウトに流し込む

表題・宛先・明細表・合計・振込先などをコードで座標配置

PDFバイト列を生成

pdf-libがPDFのバイナリを組み立てる

保存・送付

生成したPDFを保管し、必要に応じてダウンロード・送付

テキストの位置や罫線を座標で指定していくので最初は手間ですが、一度組めば以降はデータを変えるだけ。何百枚でも同じ品質で出力できます。

明細作成を効率化する仕組み

帳票の中身で一番手間がかかるのが、明細行の作成です。「どの商品を、何個、いくらで」を1行ずつ埋めていく作業ですね。

ここではSKU検索キャッシュを用意しました。一度引いた商品コード(SKU)の情報を手元に保持しておき、次に同じSKUを打ち込んだときは再検索せずに即座に呼び出せるようにしています。明細を組み立てるスピードが上がり、担当者のストレスも減りました。

帳票の種類と自動化の効果

請求書・納品書・デビットノート

輸入卸の現場では、扱う帳票が一種類ではありません。

これらを別々に手作業で作ると、明細の食い違いが起きがちです。同じデータから生成すれば、請求書と納品書の内容が自動的に一致します。

効いてくる「一貫性」

自動化のわかりやすい効果は時間短縮ですが、私が一番大きいと感じたのは一貫性です。

人間はどうしても間違えます。だからこそ、間違えようがない仕組みに寄せていくことが大切だと考えています。

まとめ

テンプレートの手作業運用から、データによる機械生成へ。この転換によって、転記ミス・属人化・書式のばらつきといった、帳票運用の慢性的な悩みを一気に解消できました。

とはいえ、コードで帳票を作るには乗り越えるべき壁がいくつかあります。それぞれ別記事で掘り下げていますので、あわせてご覧ください。