記事一覧に戻る
開発

デュアルPDFエンジン戦略|Chromium(Gotenberg)とwkhtmltopdfの使い分けとフォールバック設計

2026年3月30日 約9分で読めます
この記事でわかること
  • Gotenberg(Chromium)とwkhtmltopdfの技術的な特性と得意分野の違い
  • ユースケース別のエンジン選定基準
  • 2つのエンジンを並行運用する「デュアルエンジン」のアーキテクチャ
  • フォールバック設計の考え方と実装パターン
  • PDF生成エンジンの運用・監視で押さえるべきポイント

PDF生成エンジン選定の難しさ

WebアプリケーションやSaaSでPDFを生成する場合、「どのエンジンを使うか」は避けて通れない設計判断です。世の中にはHTML→PDF変換ツールが多数存在しますが、すべてのユースケースに万能なエンジンは存在しません

FUNBREWでは自社SaaSプロダクト「FUNBREW PDF」の開発において、Gotenberg(Chromium)とwkhtmltopdfの2つのエンジンを並行運用する「デュアルエンジン戦略」を採用しました。本記事では、この設計に至った背景と実践的なパターンを解説します。

最初はGotenberg一本で始めましたが、実際の運用で「Chromiumでは過剰な場面」と「Chromiumでなければ再現できない場面」の両方に遭遇しました。1つのエンジンに依存するリスクと、ユースケースごとの最適化を考えた結果、デュアルエンジン方式に行き着きました。

2つのエンジンの特性比較

まず、Gotenberg(Chromium)とwkhtmltopdfの技術的な特性を整理します。

Gotenberg(Chromiumベース)

GotenbergはDockerコンテナとして動作するPDF変換APIサービスです。内部でヘッドレスChromiumを使用しており、ブラウザのレンダリングエンジンをそのままPDF生成に活用します。

項目特性
CSS対応Flexbox、Grid、カスタムプロパティ等、最新CSSをフルサポート
JavaScript完全に実行可能(チャート描画、動的レンダリング等)
WebフォントGoogle Fonts等を含め完全対応
処理速度やや遅い(Chromium起動・レンダリングのオーバーヘッド)
メモリ消費大きい(Chromiumプロセスがメモリを占有)
デプロイDocker必須。コンテナ化環境と相性が良い
メンテナンス活発に開発が続いている

wkhtmltopdf

wkhtmltopdfは、Qt WebKit(古いバージョンのWebKitエンジン)をベースにしたPDF変換ツールです。

項目特性
CSS対応CSS2.1 + 一部のCSS3。Flexbox/Grid非対応
JavaScript限定的(基本的なDOM操作は可能)
Webフォント一部対応(環境依存あり)
処理速度高速(Chromiumより軽量)
メモリ消費小さい(Chromiumの数分の1)
デプロイバイナリ1つで動作。Docker不要
メンテナンス公式メンテナンス終了(セキュリティパッチ・バグ修正ともに提供されない)

性能比較の目安

同一のHTMLテンプレートをPDFに変換した場合の、一般的な性能差の目安です。

指標Gotenbergwkhtmltopdf
シンプルなPDF(テキスト+テーブル)1〜3秒0.3〜1秒
リッチなPDF(画像+チャート+複雑レイアウト)3〜8秒2〜5秒(レイアウト崩れの可能性あり)
メモリ使用量(1リクエスト)100〜300MB30〜80MB
同時処理能力(4GBサーバー)5〜10並列15〜30並列

ユースケース別のエンジン選定

2つのエンジンの特性を踏まえ、PDF生成のユースケースごとに最適なエンジンを選定します。

Gotenbergが適するユースケース

  • レポート・ダッシュボード:グラフ、チャート、複雑なレイアウトを含むビジュアルリッチなPDF
  • マーケティング資料:ブランドフォント、グラデーション、Flexboxレイアウトを使用するデザイン重視のPDF
  • Webページのスクリーンショット:実際のブラウザ表示と同一のPDF出力が求められる場合
  • 動的コンテンツ:JavaScriptで描画されるコンテンツを含むPDF

wkhtmltopdfが適するユースケース

  • 請求書・納品書:テーブルベースのシンプルなレイアウト
  • 契約書・規約文書:テキスト中心で装飾が少ないPDF
  • バッチ処理:大量のPDFを短時間で生成する場合(メモリ効率が重要)
  • 軽量環境:Dockerが使えない、またはリソースが限られた環境

デュアルエンジンのアーキテクチャ

デュアルエンジン戦略の核心は、エンジン選択の判断を1箇所に集約し、呼び出し側のコードを単純に保つことです。

設計のポイント

アーキテクチャの設計で重要なのは、以下の3つの原則です。

  1. 統一インターフェース:どのエンジンを使っても、呼び出し側は同じ方法でPDFを生成できる
  2. 設定による切り替え:テンプレートやリクエストの属性でエンジンを自動選定する
  3. フォールバック:プライマリエンジンが失敗した場合に、自動的に別エンジンで再試行する

エンジン選定ロジック

リクエストごとにどのエンジンを使うかを判定するロジックは、以下の順序で評価します。

  1. 明示指定:リクエストやテンプレートで特定のエンジンが指定されていればそれを使う
  2. テンプレート属性:テンプレートにFlexbox/Grid/JSが含まれていればGotenbergを選択
  3. デフォルト:指定がなければ、テナントやプランに応じたデフォルトエンジンを使用

この設計により、新しいエンジンを追加する場合も既存コードの変更が最小限で済みます。たとえば将来、Playwrightベースのエンジンを追加する場合も、統一インターフェースに沿って実装するだけです。

Strategyパターンの活用

デュアルエンジンの実装には、Strategyパターン(デザインパターン)が有効です。各エンジンの処理を「戦略」として抽象化し、実行時に切り替え可能にします。

Strategyパターンを採用することで得られるメリットは以下の通りです。

  • 拡張性:新しいエンジンの追加が容易
  • テスタビリティ:各エンジンの処理を独立してテスト可能
  • 保守性:エンジン固有のロジックが分離され、変更の影響範囲が限定される

フォールバック設計

フォールバックは、PDF生成SaaSのサービス継続性を支える重要な仕組みです。

フォールバックが必要な場面

障害シナリオ原因フォールバック動作
タイムアウト複雑なHTMLのレンダリングに時間がかかりすぎwkhtmltopdfで再試行(レイアウト簡略化あり)
メモリ不足Chromiumプロセスがメモリ上限に到達wkhtmltopdfで再試行
エンジン障害Gotenbergコンテナのクラッシュや応答停止wkhtmltopdfに自動切替
レンダリングエラー特定のCSS/HTMLがエンジンで正しく処理されない別エンジンで再試行

フォールバックの設計原則

  • 自動リトライ:プライマリエンジンの失敗を検知し、ユーザーの操作なしにセカンダリエンジンで再試行
  • リトライ上限:無限リトライを防ぐため、最大試行回数を設定(通常は2回:プライマリ+フォールバック1回)
  • タイムアウト設定:エンジンごとに適切なタイムアウト値を設定(Gotenberg: 30〜60秒、wkhtmltopdf: 15〜30秒)
  • 品質劣化の通知:フォールバックで生成されたPDFは品質が異なる可能性があるため、メタデータに使用エンジンを記録

フォールバック時の品質管理

GotenbergからwkhtmltopdfにフォールバックしたPDFは、見た目が異なる可能性があります。この差異にどう対処するかも設計の一部です。

  • 許容する場合:「PDFが生成されないよりは、多少レイアウトが崩れても出力された方がいい」という判断。バッチ処理や社内文書向け
  • 許容しない場合:フォールバックせずにエラーを返し、ユーザーにリトライを促す。デザイン品質が重要な外部向け資料向け

この判断はテンプレートやユースケースごとに異なるため、テンプレートレベルでフォールバック許可/禁止を設定できる設計が理想的です。

運用・監視のポイント

デュアルエンジンの運用では、単一エンジン時とは異なる監視ポイントがあります。

監視すべきメトリクス

メトリクス確認ポイント
エンジン別の成功/失敗率特定エンジンの失敗率が上昇していないか
フォールバック発生率フォールバックが頻発する場合、プライマリエンジンの調査が必要
エンジン別の処理時間p50/p95/p99で処理時間の分布を監視
メモリ使用量Gotenbergコンテナのメモリ使用量推移
キュー待機時間PDF生成リクエストがキューに滞留していないか

CJKフォントへの対応

日本語を含むPDFを生成する場合、フォントの取り扱いはエンジンを問わず注意が必要です。

  • Gotenberg:コンテナ内にフォントファイルをインストールするか、CSSで@font-faceを指定
  • wkhtmltopdf:システムにフォントがインストールされている必要あり。Dockerの場合はマルチステージビルドでフォントを追加

どちらのエンジンでも、フォントが見つからない場合は文字化けやトーフ(□)表示になります。本番環境と同じフォント設定をステージング環境でも再現し、事前に検証することが重要です。

リソース管理とスケーリング

PDF生成はCPU・メモリ集約型の処理です。マルチテナントSaaSでは、テナント間の公平性を保つためのリソース管理が重要になります。

  • 並行処理数の制限:エンジンごとに同時処理数の上限を設定し、リソース枯渇を防止
  • キューによる制御:PDF生成リクエストをキューイングし、順次処理
  • プラン別の優先度:有料プランのリクエストを優先処理
  • 水平スケーリング:Gotenbergコンテナを複数起動し、ロードバランシング

エンジン選定のディシジョンツリー

新しいPDF生成要件が出たときのエンジン選定を、ディシジョンツリーで整理します。

  1. FlexboxやCSS Gridを使用する → Gotenberg
  2. JavaScriptによるレンダリングが必要 → Gotenberg
  3. 大量バッチ処理(100件以上/時)→ wkhtmltopdf(またはGotenbergの水平スケーリング)
  4. テーブルベースのシンプルなレイアウト → wkhtmltopdf
  5. どちらでも対応可能 → Gotenberg(将来性とCSS対応の広さで優先)

迷った場合はGotenbergをプライマリに選択し、wkhtmltopdfをフォールバックとして配置するのが安全な選択です。Chromiumベースのエンジンは今後も進化が続くため、長期的な保守性の点でも有利です。

wkhtmltopdfの将来性とエンジン移行の展望

wkhtmltopdfは2023年に公式メンテナンスが終了し、セキュリティパッチも提供されない状態です。ユーザーが提供するHTMLを処理するSaaSでは、パッチ未適用のWebKitエンジンがセキュリティリスクとなり得ます。

FUNBREWでは現在、wkhtmltopdfをフォールバック用途として運用していますが、中長期的にはPlaywright(Chromiumベース)やWeasyPrint(Pythonベース)への移行を視野に入れています。Strategyパターンで設計しておけば、新しいエンジンへの切り替えは既存コードへの影響を最小限に押さえられます。

デュアルエンジン戦略の最大のメリットは、このようなエンジンの世代交代を段階的に進められる点にもあります。新エンジンをまずフォールバックとして導入し、安定性を確認した後にプライマリに昇格させる、というアプローチが取れるためです。

まとめ:デュアルエンジン戦略の設計指針

PDF生成エンジンの選定は「どちらが優れているか」ではなく、「どう組み合わせるか」が重要です。デュアルエンジン戦略のポイントをまとめます。

  1. 特性を理解して使い分ける:Gotenberg=リッチなレイアウト、wkhtmltopdf=軽量・高速
  2. 統一インターフェースで抽象化:Strategyパターンで呼び出し側をシンプルに保つ
  3. フォールバックで耐障害性を確保:プライマリ失敗時に自動切替、品質管理はテンプレートレベルで制御
  4. 監視と運用を設計に組み込む:エンジン別の成功率・処理時間・フォールバック率を継続監視

この設計パターンは、PDF生成に限らず「複数の処理エンジンを持つシステム」全般に応用可能です。画像変換、動画エンコード、文書変換など、エンジンの特性に応じた使い分けとフォールバックの考え方は共通しています。

FUNBREWでは、自社SaaSプロダクト「FUNBREW PDF」の開発で培ったPDF生成基盤の知見をもとに、システム開発をご支援しています。PDF生成やSaaS開発でお悩みの方は、ぜひお気軽にご相談ください

よくある質問
GotenbergとwkhtmltopdfのどちらがPDF生成に適していますか?
ユースケースによります。モダンなCSS(Flexbox、Grid、カスタムフォント)を多用するリッチなレイアウトにはGotenberg(Chromium)が適しています。一方、シンプルなテーブルやテキスト中心のPDFで、高速な処理が求められる場合はwkhtmltopdfが有利です。両方を用途別に使い分けるデュアルエンジン方式が最も柔軟です。
Gotenbergとは何ですか?
GotenbergはDockerベースのPDF変換APIサービスです。内部でChromiumを使用し、HTML/CSS/JavaScriptを忠実にPDFに変換します。REST APIとして提供されるため、プログラミング言語を問わず利用でき、コンテナ化されているためスケーリングも容易です。
wkhtmltopdfは非推奨ではないのですか?
wkhtmltopdfは公式のメンテナンスが終了しており、新規プロジェクトでの主力エンジンとしてはおすすめしません。ただし、軽量・高速という特性は依然として有効で、フォールバックやシンプルなPDF生成には十分実用的です。リスクを理解した上で、補助的なエンジンとして活用する分には問題ありません。
フォールバック設計はなぜ必要ですか?
PDF生成はメモリやCPUを大量に消費する処理で、特にChromiumベースのエンジンは負荷が高くなります。プライマリエンジンがタイムアウトやメモリ不足で失敗した場合に、別エンジンで再試行する仕組みがあれば、ユーザーへのサービス継続性を確保できます。SaaSではエンジン障害がそのまま顧客影響になるため、フォールバックは必須です。
PDF生成SaaSの開発を外部に依頼する場合の費用は?
PDF生成機能単体であれば100〜300万円程度、SaaSプロダクト全体(認証・課金・管理画面含む)では500〜1,500万円程度が目安です。エンジンの選定や負荷対策の設計によっても変動します。FUNBREWでは自社PDF SaaSの開発経験をもとに、最適な構成をご提案しています。

PDF生成システムの設計でお悩みですか?

FUNBREWでは自社PDF SaaSの運用経験をもとに、PDF生成基盤の設計・構築をサポートしています。

この記事をシェア

PDF生成・SaaS開発のご相談はFUNBREWへ

PDF生成エンジンの選定からSaaS全体のアーキテクチャまで、豊富な実装経験でご支援します。まずはお気軽にご相談ください。

最新情報をお届けします

IT活用のヒントやお役立ち情報を定期的にお届けします。

関連記事

開発
2026年3月30日

SaaSのWebhook配信設計|HMAC署名・リトライ・監査ログのイベント駆動アーキテクチャ

SaaSプロダクトにおけるWebhook配信の設計パターンを解説。HMAC署名による検証、指数バックオフのリトライ、監査ログの設計を、自社プロダクトの実装経験にもとづいて紹介します。

開発
2026年3月30日

APIレート制限の実装パターン|プラン別制御からRFC準拠ヘッダーまで徹底解説

APIレート制限の設計パターンを、アルゴリズム選定・プラン別制御・RFC準拠ヘッダー・エラーハンドリングの観点から解説。SaaSプロダクトの実装経験にもとづく実践的なアプローチを紹介します。

開発
2026年3月30日

SaaS APIの認証設計|APIキー管理とスコープベース権限制御の実装パターン

SaaS APIの認証設計を、ハッシュ化APIキー管理・スコープベース権限制御・セキュリティ対策の3つの柱で解説。自社プロダクトの実装経験にもとづく実践的な設計パターンを紹介します。

AI・DX
2026年3月8日

マルチテナントSaaSの設計と実装|アーキテクチャの選び方

マルチテナントアーキテクチャはSaaS開発の根幹をなす設計パターンです。1つのアプリケーションを複数の企業(テナント)が共有して利用するため、「テナント間のデータをどう分離するか」が最大の設計判断になります。 分離レベルは大きく3つ:DB分離型、スキーマ分離型、行レベル分離型です。

相談のハードル、下げました

まずは気軽にご相談ください

「まだ具体的に決まっていない」「とりあえず話を聞きたい」でも大丈夫。プロトタイプを見ながら、一緒にアイデアを形にしていきましょう。

相談無料 オンライン対応 1週間でプロトタイプ