PDF生成比較:WeasyPrint vs Gotenberg vs Puppeteer でPDFを自動生成する
オープンソースラボ編集部 ・ 2026年6月14日
PDF生成比較:WeasyPrint vs Gotenberg vs Puppeteer でPDFを自動生成する
🖨️ 請求書・レポート・証明書の自動PDF生成はどのツールで実装すべきか。WeasyPrint・Gotenberg・Puppeteer(ヘッドレスChrome)を比較します。
PDF自動生成の主なアプローチ
- HTML→PDF変換: HTML/CSSをPDFに変換(WeasyPrint・Puppeteer・Gotenberg)
- ライブラリ直接生成: プログラムでPDFを組み立て(PDFKit・ReportLab等)
本記事はHTML→PDF変換ツールにフォーカスします。
主要ツール比較表
| 項目 | WeasyPrint | Gotenberg | Puppeteer(Chrome) |
|---|---|---|---|
| ライセンス | BSD | MIT | Apache 2.0 |
| 言語 | Python | Go(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はブラウザ起動コストがあるため初回は遅いですが、ブラウザインスタンスを再利用すればスループットは改善します。