どの言語からでも
Python、Node.js、Ruby、C#、Java、Go、PHP。どれもそれぞれのパッケージレジストリから入ります。Rustで書いたエンジン1つを、7言語のSDKが同じように呼びます。エンジンをRustで書いて各言語から呼ぶ形にしたのは、JavaScript製のライブラリをRailsから使えずに諦めたからです。
請求書、領収書、申込書、原稿用紙。YAMLのテンプレートとJSONのデータからPDFを出力するRust製のエンジンです。
このページを開いた時点で、WASMのエンジンがブラウザに読み込まれています。下のYAMLを書き換えて入力が止まると、レンダリングし直します(※ サーバーには何も送信されません)。
いじる場所は3つだけです。pageのmargin: 24を40にすればページ全体が動き、defaultsのfontSize: 10を13にすれば下の行が全部大きくなり、カードのpadding: 12を24にすれば表の周りだけ空きます。どれも1箇所で、下の要素の位置はエンジンが計算し直します。
日本語の例を試すときは、ボタンを押して日本語フォント(約9MB)を読み込んでください。ブラウザ上で動かしていますが、CLIでもDockerでもSDKでも、同じ入力からは同じPDFが出ます。
Shojikuのメインの機能は、領収書や、受付票のお客様控えのような帳票の生成です。画面で見せるためではなく、印刷して渡すことを前提にした、業務用の帳票エンジンです。
PythonのSDKではこう書きます。
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では普通の要件です。Shojikuでは、その差分をテンプレートのYAMLに閉じ込められます。テナントごとのtemplates.ymlをストレージに置き、生成のときにどれを読むかを選ぶだけです。アプリケーションのコードは1つのまま、Rust製のエンジンをPython、Go、Ruby、Java、C#、PHP、Node.jsのどれからでも同じように呼びます。
テンプレートが参照できるデータ項目はdefinitions.ymlが台帳になっています。テナント側で書き換えたテンプレートが存在しないキーを参照していれば、PDFを生成する前に診断で止まります。
テナントの担当者に体裁を触らせたい場合は、Designerを自分たちのシステムの下にマウントできます。静的ビルドを/admin/designer/のような自社のパスで配信し、認証は手前のリバースプロキシで済ませ、保存は自社のAPIへ流します。Shojikuは認証コードを持たず、何もホストしません(マウント手順)。
領収書のような帳票は、配ったあとに「本当にこのサーバーが出力したものか」が問題になることがあります。多くのPDF生成ライブラリは電子署名に対応していませんが、Shojikuは署名までサポートしています。
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から出さずに署名することもできます。
# 秘密鍵は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つのまま使い回せます。 組み込み以外の言語にまとめました。
テンプレートを自分で書く必要はありません。MCPサーバーとスキルが同梱されているので、AIエージェントにそのまま頼めます。セットアップは2コマンドです(Claude Codeの例。詳細はクイックスタートを参照してください)。
claude mcp add shojiku -- \
docker run --rm -i --entrypoint shojiku-mcp \
-v "$PWD:/work" -w /work ghcr.io/kengos/shojiku:edgenpx skills add kengos/shojikuあとは頼むだけです。
受付票のテンプレートを作って。上に店名、真ん中に予約番号とQRコード、下に注文の明細表。
エージェントがYAMLを書き、MCPサーバーで検証し、プレビューを確認し、診断が消えるまで直します。詳細はエージェントにあります。
AIが出力したテンプレートで気に入らないところを、人間が手で直すためのGUIも用意しました。使い方は、Designerをブラウザで開いてtemplates.ymlを読み込み、キャンバス上で位置やスタイルを修正するだけです。
