Skip to content

請求書、領収書、申込書、原稿用紙。YAMLのテンプレートとJSONのデータからPDFを出力するRust製のエンジンです。

ライブプレビュー

このページを開いた時点で、WASMのエンジンがブラウザに読み込まれています。下のYAMLを書き換えて入力が止まると、レンダリングし直します(※ サーバーには何も送信されません)。

いじる場所は3つだけです。pagemargin: 2440にすればページ全体が動き、defaultsfontSize: 1013にすれば下の行が全部大きくなり、カードのpadding: 1224にすれば表の周りだけ空きます。どれも1箇所で、下の要素の位置はエンジンが計算し直します。

日本語の例を試すときは、ボタンを押して日本語フォント(約9MB)を読み込んでください。ブラウザ上で動かしていますが、CLIでもDockerでもSDKでも、同じ入力からは同じPDFが出ます。

アーキテクチャ

Shojikuのメインの機能は、領収書や、受付票のお客様控えのような帳票の生成です。画面で見せるためではなく、印刷して渡すことを前提にした、業務用の帳票エンジンです。

PythonのSDKではこう書きます。

python
import shojiku

client = shojiku.Client(
    templates="templates/",        # テンプレート(templates.yml)を置いたディレクトリ
    font_dirs=["packs/fonts"],
    locale_dirs=["packs/locale"],
)
params = {"order": fetch_order(order_id)}  # 帳票に載せる値。DBのデータから組み立てる
result = client.generate("receipt-ja", params)
open("receipt.pdf", "wb").write(result.artifact.bytes)

テンプレートの書き方やできる表現は、リファレンス(機能ごとに1ページ)とチュートリアルを参考にしてください。テンプレート作成をAIに任せる方法はエージェントで説明しています。

マルチテナントのSaaSで帳票を出す

テナントごとに請求書や領収書の体裁が違う、というのはSaaSでは普通の要件です。Shojikuでは、その差分をテンプレートのYAMLに閉じ込められます。テナントごとのtemplates.ymlをストレージに置き、生成のときにどれを読むかを選ぶだけです。アプリケーションのコードは1つのまま、Rust製のエンジンをPython、Go、Ruby、Java、C#、PHP、Node.jsのどれからでも同じように呼びます。

テンプレートが参照できるデータ項目はdefinitions.ymlが台帳になっています。テナント側で書き換えたテンプレートが存在しないキーを参照していれば、PDFを生成する前に診断で止まります。

テナントの担当者に体裁を触らせたい場合は、Designerを自分たちのシステムの下にマウントできます。静的ビルドを/admin/designer/のような自社のパスで配信し、認証は手前のリバースプロキシで済ませ、保存は自社のAPIへ流します。Shojikuは認証コードを持たず、何もホストしません(マウント手順)。

署名もできます

領収書のような帳票は、配ったあとに「本当にこのサーバーが出力したものか」が問題になることがあります。多くのPDF生成ライブラリは電子署名に対応していませんが、Shojikuは署名までサポートしています。

python
provider = shojiku.LocalPem(key="signer.key", cert="signer.crt")
signed = result.artifact.sign(provider)
open("receipt-signed.pdf", "wb").write(signed.artifact.bytes)

署名したPDFをストレージ(S3やCloud Storage)に保存しておくことで、あとから正しくサーバーから出力されたものであることを確認できます。

秘密鍵をクラウドKMSやHSMから出さずに署名することもできます。

python
# 秘密鍵はShojikuのエンジンに渡りません。エンジンは署名対象のバイト列を渡すだけで、
# 署名して返すのは、アプリケーションがすでに使っているKMSのクライアントです。
provider = shojiku.ExternalSigner(
    lambda to_be_signed: kms.sign(
        KeyId=os.environ["KEY_ID"],
        Message=to_be_signed,
        MessageType="RAW",
        SigningAlgorithm="ECDSA_SHA_256",
    )["Signature"],
    cert="signer.crt",
    algorithm=shojiku.Algorithm.ECDSA_P256_SHA256,
)
signed = result.artifact.sign(provider)

この機能はすべてのSDKとCLIから、同じ書き方で使えます。

ちょっと変わった使い方も

縦書きや、履歴書のような書式も作れます。どちらにも対応していない帳票エンジンがほとんどです。下の2枚は、AIエージェントに依頼してShojikuでレンダリングしたものです。

縦書き小説履歴書

出力例は他にもギャラリーに並んでいます。

エンジンに組み込まれている言語は日本語と英語だけですが、繁体字と簡体字の中国語、ヒンディー語、フィリピン語、タイ語はロケールパックというファイルで足せます。 通貨も日付も桁区切りもフォントもそのファイルが決めるので、テンプレートは1つのまま使い回せます。 組み込み以外の言語にまとめました。

AIエージェントでの帳票の作成

テンプレートを自分で書く必要はありません。MCPサーバーとスキルが同梱されているので、AIエージェントにそのまま頼めます。セットアップは2コマンドです(Claude Codeの例。詳細はクイックスタートを参照してください)。

bash
claude mcp add shojiku -- \
  docker run --rm -i --entrypoint shojiku-mcp \
  -v "$PWD:/work" -w /work ghcr.io/kengos/shojiku:edge
bash
npx skills add kengos/shojiku

あとは頼むだけです。

受付票のテンプレートを作って。上に店名、真ん中に予約番号とQRコード、下に注文の明細表。

エージェントがYAMLを書き、MCPサーバーで検証し、プレビューを確認し、診断が消えるまで直します。詳細はエージェントにあります。

GUIでの細かい修正も可能

AIが出力したテンプレートで気に入らないところを、人間が手で直すためのGUIも用意しました。使い方は、Designerをブラウザで開いてtemplates.ymlを読み込み、キャンバス上で位置やスタイルを修正するだけです。

Designerで見積書テンプレートを開き、合計金額のテキストを選択して編集しているところ