AI

PDF生成比較:WeasyPrint vs Gotenberg vs Puppeteer でPDFを自動生成する

オープンソースラボ編集部2026年6月14日

PDF生成比較:WeasyPrint vs Gotenberg vs Puppeteer でPDFを自動生成する

🖨️ 請求書・レポート・証明書の自動PDF生成はどのツールで実装すべきか。WeasyPrint・Gotenberg・Puppeteer(ヘッドレスChrome)を比較します。

PDF自動生成の主なアプローチ

  1. HTML→PDF変換: HTML/CSSをPDFに変換(WeasyPrint・Puppeteer・Gotenberg)
  2. ライブラリ直接生成: プログラムでPDFを組み立て(PDFKit・ReportLab等)

本記事はHTML→PDF変換ツールにフォーカスします。

主要ツール比較表

項目WeasyPrintGotenbergPuppeteer(Chrome)
ライセンスBSDMITApache 2.0
言語PythonGo(APIサーバー)Node.js
CSS対応CSS3(Page Media)Chrome(完全)Chrome(完全)
JavaScript実行×
APIサーバー×サードパーティ
フォント対応
日本語対応
メモリ使用軽量中(Chrome不使用)重め(Chrome起動)

各ツールの特徴

WeasyPrint

Pythonで書かれたHTML/CSS→PDFコンバーター。W3CのCSS Page Mediaモジュールに対応しており、印刷向けレイアウトに強みを持ちます。

主な特徴:

  • @page・@media print に準拠した正確なページ制御
  • ヘッダー・フッター・ページ番号の自動挿入
  • pip一発でインストール可能
  • Djangoテンプレートとの相性が良い
from weasyprint import HTML

# HTMLファイルからPDFを生成
HTML(filename='invoice.html').write_pdf('invoice.pdf')

# HTML文字列から生成
html_content = '''
<!DOCTYPE html>
<html>
<head>
  <style>
    @page { size: A4; margin: 2cm; }
    @page { @bottom-center { content: "Page " counter(page) " of " counter(pages); } }
    body { font-family: "Noto Sans JP", sans-serif; }
  </style>
</head>
<body>
  <h1>請求書</h1>
  <table>...</table>
</body>
</html>
'''
HTML(string=html_content).write_pdf('output.pdf')

向いているケース: PythonバックエンドでのPDF生成

Gotenberg

Chromeを使わずにHTMLをPDFに変換するDockerマイクロサービス。APIエンドポイントにHTMLをPOSTするだけでPDFが返ります。

主な特徴:

  • Chromium + LibreOffice を内蔵したDockerコンテナ
  • RESTful APIでどの言語からでも呼び出し可能
  • Word/ExcelファイルのPDF変換もサポート
  • Kubernetes対応でスケーラブル
# Docker起動
docker run --rm -p 3000:3000 gotenberg/gotenberg:8

# curlでPDF変換
curl   --request POST   --url http://localhost:3000/forms/chromium/convert/html   --form 'files=@"index.html"'   -o output.pdf
# Pythonから呼び出し
import requests

with open('invoice.html', 'rb') as f:
    response = requests.post(
        'http://localhost:3000/forms/chromium/convert/html',
        files={'files': ('invoice.html', f, 'text/html')}
    )

with open('invoice.pdf', 'wb') as f:
    f.write(response.content)

向いているケース: 言語非依存のマイクロサービス

Puppeteer(ヘッドレスChrome)

本物のChromeブラウザでページを描画してPDF化。JavaScriptが完全実行されるため、React/Vue等のSPAのPDF化が可能です。

主な特徴:

  • Chromeの完全なレンダリングエンジン使用
  • JavaScriptフレームワーク(React/Vue等)に対応
  • スクリーンショット機能も内蔵
  • ページ読み込み完了を待機してからPDF化できる
const puppeteer = require('puppeteer');

async function generatePDF(url, outputPath) {
  const browser = await puppeteer.launch({ args: ['--no-sandbox'] });
  const page = await browser.newPage();

  await page.goto(url, { waitUntil: 'networkidle0' });

  await page.pdf({
    path: outputPath,
    format: 'A4',
    printBackground: true,
    margin: { top: '1cm', right: '1cm', bottom: '1cm', left: '1cm' }
  });

  await browser.close();
}

generatePDF('http://localhost:3000/invoice/123', 'invoice.pdf');

向いているケース: SPAやJavaScript必須のページ

選択ガイド

PythonバックエンドでシンプルなHTML/CSS PDF
  → WeasyPrint

言語非依存・マイクロサービス・Word変換も必要
  → Gotenberg

React/Vue等のSPA・JavaScript実行必須
  → Puppeteer

内部リンク

外部リソース

FAQ

Q. 日本語フォントを正しく表示するには?

WeasyPrintとGotenbergはフォントファイルを明示的に指定する必要があります。Noto Sans JPなどを組み込んでCSSでfont-familyを指定してください。

Q. ページヘッダー・フッター・ページ番号はどのツールで設定できますか?

WeasyPrintはCSS @pageで細かく制御できます。GotenbergとPuppeteerもheader/footerテンプレートが使えます。

Q. サーバーサイドレンダリング(SSR)のHTMLでも動きますか?

WeasyPrintとGotenbergはサーバー側でレンダリング済みのHTMLを処理するため、SSRとの相性は良いです。

Q. パフォーマンスはどのくらい違いますか?

WeasyPrintが最も軽量です。Puppeteerはブラウザ起動コストがあるため初回は遅いですが、ブラウザインスタンスを再利用すればスループットは改善します。

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。