書面の自動生成

テンプレートにデータを流し込んで、印刷可能な PDF(契約書、請求書、帳票、証明書等)をプログラムで生成すること。

なぜ必要か

手作業で Word や Excel から PDF を作るのは:

プログラムで自動生成すれば、データベースの値を流し込むだけで何百枚でも正確に出せる。

パイプライン

flowchart LR
    Data[データ<br/>DB / API / フォーム] --> Template[テンプレート<br/>HTML + CSS]
    Template --> Engine[変換エンジン]
    Engine --> PDF[印刷可能な PDF]
    PDF --> Delivery[配信<br/>メール / ダウンロード / 印刷]

テンプレートの書き方

主流は HTML + CSS。Web の技術がそのまま使える。

<!-- 契約書テンプレートの例 -->
<style>
  @page {
    size: A4 portrait;
    margin: 25mm 20mm;
    @top-center { content: "業務委託契約書"; }
    @bottom-right { content: counter(page) " / " counter(pages); }
  }
</style>

<h1>業務委託契約書</h1>
<p>甲: {{company_name}}</p>
<p>乙: {{contractor_name}}</p>
<p>契約期間: {{start_date}} 〜 {{end_date}}</p>

{{変数}} の部分をテンプレートエンジン(Jinja2, Handlebars, Almide の文字列テンプレート等)で埋める。

CSS Paged Media — 印刷のための CSS

ブラウザの @media print では不十分な部分を補う CSS 仕様群。

機能CSS プロパティ用途
ページサイズ@page { size: A4 }A4, Letter, B5 等
余白@page { margin: 25mm }印刷の余白
ヘッダ/フッタ@top-center, @bottom-rightページ番号、タイトル
改ページ制御page-break-before, break-after章ごとに改ページ
柱string-set, content: string()ランニングヘッダ
脚注float: footnoteページ下部に注釈
目次target-counter()参照先のページ番号を自動取得

問題: ブラウザは CSS Paged Media をほぼ実装していない。 だから変換エンジンが必要。

変換エンジンの選択肢

flowchart TB
    subgraph oss["OSS(無料)"]
        direction TB
        PA["Pagina<br/>Rust / Servo ベース<br/>CSS Paged Media 対応"]
        PJ["Paged.js<br/>JS / ブラウザ上で組版"]
        VS["Vivliostyle<br/>JS / 日本語組版に強い"]
        WP["WeasyPrint<br/>Python / サーバーサイド向き"]
        PP["Puppeteer / Playwright<br/>ヘッドレスブラウザで印刷"]
    end

    subgraph commercial["商用"]
        direction TB
        PR["Prince<br/>CSS Paged Media ほぼフル対応<br/>$495〜"]
        DR["DocRaptor<br/>Prince のクラウド API 版"]
    end
エンジン言語CSS Paged Media向いている用途
PrinceCLIほぼフル対応高品質な出版物
PaginaRust (CLI)コア機能対応高速・OSS での本格組版
Paged.jsJS (CDN)部分的フロントエンドでプレビュー+印刷
VivliostyleJS (CLI)部分的日本語の書籍組版
WeasyPrintPython部分的サーバーサイドの帳票生成
PuppeteerNode.jsブラウザ依存スクショ感覚で PDF 化

ユースケース別の選び方

ユースケースおすすめ
社内の請求書・見積書WeasyPrint or Puppeteer(十分)
契約書(レイアウト重要)Prince or Paged.js
書籍・マニュアル(日本語)Vivliostyle
ブラウザ上でプレビュー → 印刷Paged.js
API で大量生成WeasyPrint or DocRaptor(Prince のクラウド版)

関連

Graph