青色申告決算書(一般用、1〜4ページ)のPDF出力に対応した。国税庁の様式PDFに、帳簿から集計した数字をそのまま重ねて出力できる。
様式を自前描画せず、PDFに重ねる方式にした
決算書は罫線・マス目・文言が細かい様式なので、TCPDFで一から罫線を描くのは非効率だし、様式変更のたびに描き直しになる。そこで国税庁配布の様式PDFをPNG化したものを背景画像として使い、数字だけをオーバーレイで重ねる方式にした。
これをやるには、様式PDF上の各欄が「どの座標にあるか」を知る必要がある。数字は1マスずつ枠で区切られているので、右詰めで1桁ずつ座標を計算して置いていく。
座標の抽出はFableに書かせた
座標抽出スクリプトは、コードそのものをFableに書かせた。pdfplumberで様式PDFを解析し、罫線・矩形から「数字マスの並び」を検出してJSONに出力するツール。
マス目は矩形(rect)で描かれているページもあれば、二重矩形の塗りつぶしで枠線を表現しているページもあり、一枚岩のロジックでは拾いきれなかった。この手のヒューリスティックの調整をFableと繰り返して座標データを固めた。人間が定規を当てて座標を測っていく作業をしなくて済んだのは素直に助かった。
コードの中身は見てないけど、結果はとても素晴らしい。もちろん、プレビューで微調整は必要だったけど。
スクリプト自体のコードレビューはできていないので、把握できていないソースを公開すべきではないと考えているので、このスクリプトと出力JSONはリポジトリにコミットせず、ローカルのみで扱っている。
テンプレートは年度で分岐する
様式は2020年以降と2023年以降で微妙にレイアウトが違うため、resources/blue-return/templates/from2020とfrom2023でテンプレートを分け、TemplateResolverが年度に応じて背景画像とオーバーレイの実装を切り替える。
リポジトリにコミットするのはPHPの定義ファイルだけ
様式の元になっている国税庁PDF、それをPNG化した背景画像、座標抽出スクリプトとその出力JSONは、いずれもgitリポジトリに含めていない。背景画像は再配布していいものか著作権的に判断がつかないため、座標抽出スクリプトはコードレビューできておらず出力(座標データ)の妥当性しか確認していないため。どちらも「把握・許諾しきれていないものは公開しない」という同じ基準で外している。
コミットするのは、座標をハードコードしたPHPのオーバーレイ定義(Page1Overlayなど)だけ。これは自分で書いた・読んだコードなので中身を把握できている。背景画像はサーバー構築者が各自で用意してセットする運用にする。将来的には自作の様式テンプレートを用意して、この制約自体をなくしたい。