Skip to content

他のツールとの比較

それぞれ得意分野が違います。順に見ていきます。

HTML/CSS系(WeasyPrint, Prince, wkhtmltopdf, Puppeteer印刷)

ブラウザの描画をそのままPDFにするツール群です。画面で見せているページを、ユーザーにそのままダウンロードさせる用途には良い選択です。既存のCSS資産も活きます。

一方、描画は実行環境に依存します。ブラウザやライブラリのバージョン、インストールされているフォントで出力が変わりえます。帳票で欲しくなるもの(改ページをまたぐ表ヘッダ、面付け、記入マス、縦書きの禁則)は、CSSの標準に無いか、あっても対応がツールごとにまちまちです。

また、出力のバイト列が毎回同じにならない問題もあります。テンプレートを一箇所直したとき、ほかの帳票が変わっていないことを機械的に確かめられず、確認はスクリーンショットの目視比較に頼ることになります。

Shojikuは、同じ入力なら同じバイト列を出します。バイト比較だけで回帰を検出でき、CIでは同梱しているすべての例をこの方式で検査しています。

テンプレートPDFライブラリ(ReportLab, prawn, FPDF系)

座標とAPIで直接描くツールです。以下は擬似コードです。

python
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の値が690660かだけです。取り違えて描いてもエラーにはならず、それらしいPDFが出てきます。欄の描き忘れも同じで、気づけるのは目視だけです。

Shojikuでは、レイアウトはコードではなくYAMLのファイルです。どのキーがどこに出るかはファイルを見ればわかり、デザイナーもPMもAIエージェントも同じファイルを編集できます。テンプレートと、データ項目の台帳definitions.ymlとの食い違いは、レンダリングの前のvalidateで見つかります。paramsの渡し忘れや型違いも、診断コードつきの警告になります。

pdfme

同じ「テンプレート+データ」の発想を持つ、良いツールです。ブラウザで動くデザイナーもあります。サーバーサイドがNodeなら、Shojikuに移行する必要はありません。

大きな違いは、Node以外の言語から使えるかどうかです。Shojikuの本体はRustのバイナリのため、どの言語からでも使うことができます。また、縦書き(禁則やルビ、縦中横まで)や和暦、署名と検証のような独自の機能もあるので、要件に合わせて選んでください。

Typst / LaTeX

論文や書籍のような長い文書は、Shojikuでは対象としていません。そちらはTypstやLaTeXを使ってください。Shojikuが対象にしているのは、領収書や納品書のような、数ページ程度の帳票の印刷です。