他のツールとの比較
それぞれ得意分野が違います。順に見ていきます。
HTML/CSS系(WeasyPrint, Prince, wkhtmltopdf, Puppeteer印刷)
ブラウザの描画をそのままPDFにするツール群です。画面で見せているページを、ユーザーにそのままダウンロードさせる用途には良い選択です。既存のCSS資産も活きます。
一方、描画は実行環境に依存します。ブラウザやライブラリのバージョン、インストールされているフォントで出力が変わりえます。帳票で欲しくなるもの(改ページをまたぐ表ヘッダ、面付け、記入マス、縦書きの禁則)は、CSSの標準に無いか、あっても対応がツールごとにまちまちです。
また、出力のバイト列が毎回同じにならない問題もあります。テンプレートを一箇所直したとき、ほかの帳票が変わっていないことを機械的に確かめられず、確認はスクリーンショットの目視比較に頼ることになります。
Shojikuは、同じ入力なら同じバイト列を出します。バイト比較だけで回帰を検出でき、CIでは同梱しているすべての例をこの方式で検査しています。
テンプレートPDFライブラリ(ReportLab, prawn, FPDF系)
座標とAPIで直接描くツールです。以下は擬似コードです。
c = canvas.Canvas("receipt.pdf", pagesize=A4)
c.setFont("HeiseiKakuGo-W5", 14)
c.drawString(96, 720, customer.name)
c.drawRightString(500, 690, f"¥{order.subtotal_ex_tax:,}") # 税抜の枠
c.drawRightString(500, 660, f"¥{order.total_in_tax:,}") # 税込の枠
c.save()何でも描けますが、レイアウトがコードになるため、デザイナーやPM、AIエージェントとの協業には向きません。どのデータがどこに印字されるのかはコードを読まないとわからず、コードは長くなりがちで、保守がとても大変です。
しかも、上の擬似コードで言えば、税抜の枠と税込の枠の違いは、yの値が690か660かだけです。取り違えて描いてもエラーにはならず、それらしいPDFが出てきます。欄の描き忘れも同じで、気づけるのは目視だけです。
Shojikuでは、レイアウトはコードではなくYAMLのファイルです。どのキーがどこに出るかはファイルを見ればわかり、デザイナーもPMもAIエージェントも同じファイルを編集できます。テンプレートと、データ項目の台帳definitions.ymlとの食い違いは、レンダリングの前のvalidateで見つかります。paramsの渡し忘れや型違いも、診断コードつきの警告になります。
pdfme
同じ「テンプレート+データ」の発想を持つ、良いツールです。ブラウザで動くデザイナーもあります。サーバーサイドがNodeなら、Shojikuに移行する必要はありません。
大きな違いは、Node以外の言語から使えるかどうかです。Shojikuの本体はRustのバイナリのため、どの言語からでも使うことができます。また、縦書き(禁則やルビ、縦中横まで)や和暦、署名と検証のような独自の機能もあるので、要件に合わせて選んでください。
Typst / LaTeX
論文や書籍のような長い文書は、Shojikuでは対象としていません。そちらはTypstやLaTeXを使ってください。Shojikuが対象にしているのは、領収書や納品書のような、数ページ程度の帳票の印刷です。