PDF生成APIを使えば、HTMLからPDFを数行のコードで生成できます。サーバーにChromiumをインストールしたり、wkhtmltopdfのバージョンを管理したりする必要はありません。APIキーひとつでPDF生成を始められます。
この記事では、Node.js・Python・PHPの3言語でFUNBREW PDF APIの使い方をステップバイステップで解説します。各言語で複数のHTTPクライアントの例を用意しているので、既存のプロジェクトにすぐ組み込めます。
他のPDF生成ツールとの違いについてはHTML to PDF API比較を参照してください。PuppeteerやPlaywrightからの移行を検討している場合はPuppeteer移行ガイドも参照してください。
準備
1. アカウント作成
無料アカウントを作成します。月30件まで無料でPDF生成が可能です。
2. APIキーの取得
ダッシュボードの「APIキー」セクションからキーを発行します。キーはsk-で始まる文字列です。
# 環境変数に設定(推奨)
export FUNBREW_PDF_API_KEY="sk-your-api-key"
APIキーの安全な管理方法についてはセキュリティガイドを参照してください。
3. APIエンドポイント
POST https://api.pdf.funbrew.cloud/v1/pdf/from-html
HTMLを送信するとPDFバイナリが返ります。シンプルなリクエスト/レスポンスモデルです。
Node.js
TypeScriptを使用している場合はTypeScript向けPDF APIガイドも参照してください。
fetch(標準API)
Node.js 18以降は標準のfetchが利用できます。追加パッケージ不要です。
const fs = require('fs');
async function generatePdf() {
const response = await fetch('https://api.pdf.funbrew.cloud/v1/pdf/from-html', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.FUNBREW_PDF_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
html: `
<html>
<head>
<style>
body { font-family: 'Noto Sans JP', sans-serif; padding: 40px; }
h1 { color: #1a1a1a; border-bottom: 2px solid #3b82f6; padding-bottom: 8px; }
.info { color: #6b7280; margin-top: 24px; }
</style>
</head>
<body>
<h1>レポート</h1>
<p>これはAPIから生成されたPDFです。</p>
<p class="info">生成日時: ${new Date().toISOString()}</p>
</body>
</html>
`,
engine: 'quality',
format: 'A4',
}),
});
if (!response.ok) {
throw new Error(`API error: ${response.status}`);
}
const pdf = Buffer.from(await response.arrayBuffer());
fs.writeFileSync('output.pdf', pdf);
console.log('PDF generated: output.pdf');
}
generatePdf();
axios
axiosを使う場合はレスポンスタイプの指定がポイントです。
const axios = require('axios');
const fs = require('fs');
async function generatePdf() {
const { data } = await axios.post(
'https://api.pdf.funbrew.cloud/v1/pdf/from-html',
{
html: '<h1>Hello PDF</h1><p>Generated with axios</p>',
engine: 'fast',
format: 'A4',
},
{
headers: { 'Authorization': `Bearer ${process.env.FUNBREW_PDF_API_KEY}` },
responseType: 'arraybuffer', // バイナリレスポンスの指定が必須
}
);
fs.writeFileSync('output.pdf', data);
console.log('PDF generated: output.pdf');
}
generatePdf();
Python
Django・FastAPIなどフレームワークとの統合方法についてはDjango・FastAPI向けPDF APIガイドを参照してください。
requests
Pythonで最もポピュラーなHTTPライブラリです。
import os
import requests
def generate_pdf():
response = requests.post(
'https://api.pdf.funbrew.cloud/v1/pdf/from-html',
headers={
'Authorization': f'Bearer {os.environ["FUNBREW_PDF_API_KEY"]}',
},
json={
'html': '''
<html>
<head>
<style>
body { font-family: 'Noto Sans JP', sans-serif; padding: 40px; }
h1 { color: #1a1a1a; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #e5e7eb; padding: 12px; text-align: left; }
th { background: #f8fafc; }
</style>
</head>
<body>
<h1>売上レポート</h1>
<table>
<tr><th>月</th><th>売上</th></tr>
<tr><td>1月</td><td>¥1,200,000</td></tr>
<tr><td>2月</td><td>¥1,350,000</td></tr>
<tr><td>3月</td><td>¥1,500,000</td></tr>
</table>
</body>
</html>
''',
'engine': 'quality',
'format': 'A4',
},
timeout=30,
)
response.raise_for_status()
with open('report.pdf', 'wb') as f:
f.write(response.content)
print(f'PDF generated: report.pdf ({len(response.content)} bytes)')
generate_pdf()
httpx(async対応)
非同期処理が必要な場合はhttpxが便利です。
import httpx
import asyncio
import os
async def generate_pdf():
async with httpx.AsyncClient() as client:
response = await client.post(
'https://api.pdf.funbrew.cloud/v1/pdf/from-html',
headers={'Authorization': f'Bearer {os.environ["FUNBREW_PDF_API_KEY"]}'},
json={
'html': '<h1>Async PDF</h1><p>Generated with httpx</p>',
'engine': 'fast',
'format': 'A4',
},
timeout=30,
)
response.raise_for_status()
with open('output.pdf', 'wb') as f:
f.write(response.content)
print('PDF generated: output.pdf')
asyncio.run(generate_pdf())
PHP
Next.js・Nuxtとの統合についてはNext.js・Nuxt向けPDF APIガイドを、Ruby・GoのコードサンプルはGo言語についてはRuby・Go クイックスタートを参照してください。
Laravel(Http ファサード)
LaravelのHttpファサードを使えば、最も簡潔に書けます。
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
$response = Http::withToken(config('services.funbrew.api_key'))
->post('https://api.pdf.funbrew.cloud/v1/pdf/from-html', [
'html' => '
<html>
<head>
<style>
body { font-family: "Noto Sans JP", sans-serif; padding: 40px; }
h1 { color: #1a1a1a; }
</style>
</head>
<body>
<h1>納品書</h1>
<p>株式会社テスト 御中</p>
<p>合計金額: ¥330,000(税込)</p>
</body>
</html>
',
'engine' => 'quality',
'format' => 'A4',
]);
if ($response->successful()) {
Storage::put('pdfs/delivery-note.pdf', $response->body());
}
cURL(フレームワーク不問)
フレームワークを使わない場合のcURL例です。
$ch = curl_init('https://api.pdf.funbrew.cloud/v1/pdf/from-html');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('FUNBREW_PDF_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'html' => '<h1>Hello PDF</h1>',
'engine' => 'fast',
'format' => 'A4',
]),
]);
$pdf = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
file_put_contents('output.pdf', $pdf);
}
Ruby
RubyからFUNBREW PDF APIを呼び出す場合の例です。標準ライブラリのnet/httpと、人気のあるfaradayの2パターンを紹介します。
net/http(標準ライブラリ)
require 'net/http'
require 'json'
require 'uri'
uri = URI('https://api.pdf.funbrew.cloud/v1/pdf/from-html')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{ENV['FUNBREW_PDF_API_KEY']}"
request['Content-Type'] = 'application/json'
request.body = {
html: '<h1>Hello from Ruby</h1><p>PDF generated with net/http</p>',
engine: 'fast',
format: 'A4'
}.to_json
response = http.request(request)
if response.code == '200'
File.open('output.pdf', 'wb') { |f| f.write(response.body) }
puts "PDF generated: output.pdf (#{response.body.bytesize} bytes)"
else
puts "Error: #{response.code} - #{response.body}"
end
Faraday
require 'faraday'
conn = Faraday.new(url: 'https://api.pdf.funbrew.cloud') do |f|
f.request :json
f.headers['Authorization'] = "Bearer #{ENV['FUNBREW_PDF_API_KEY']}"
end
response = conn.post('/v1/pdf/from-html', {
html: '<h1>Hello from Ruby</h1><p>PDF generated with Faraday</p>',
engine: 'quality',
format: 'A4'
})
File.open('output.pdf', 'wb') { |f| f.write(response.body) } if response.success?
Go
GoからAPIを呼び出す場合は標準ライブラリだけで実装できます。
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
func main() {
payload, _ := json.Marshal(map[string]interface{}{
"html": "<h1>Hello from Go</h1><p>PDF generated with net/http</p>",
"engine": "fast",
"format": "A4",
})
req, _ := http.NewRequest("POST",
"https://api.pdf.funbrew.cloud/v1/pdf/from-html",
bytes.NewBuffer(payload))
req.Header.Set("Authorization", "Bearer "+os.Getenv("FUNBREW_PDF_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
if resp.StatusCode == 200 {
pdf, _ := io.ReadAll(resp.Body)
os.WriteFile("output.pdf", pdf, 0644)
fmt.Printf("PDF generated: output.pdf (%d bytes)\n", len(pdf))
} else {
body, _ := io.ReadAll(resp.Body)
fmt.Printf("Error %d: %s\n", resp.StatusCode, body)
}
}
エラーハンドリング
API呼び出し時は必ずHTTPステータスコードを確認しましょう。主なエラーコードと対処法は以下の通りです。より詳しいエラー処理のパターンについてはPDF APIエラーハンドリング完全ガイドを参照してください。
| ステータス | 意味 | 対処法 |
|---|---|---|
| 400 | リクエスト不正(HTMLが空など) | リクエストボディを確認 |
| 401 | 認証エラー(APIキー不正) | APIキーを再確認、環境変数を確認 |
| 429 | レート制限超過 | リトライ間隔を空ける、プランのアップグレードを検討 |
| 500 | サーバーエラー | 時間を置いてリトライ |
タイムアウトの設定も重要です。複雑なHTMLの場合、PDF生成に数秒かかることがあります。タイムアウトは30秒以上に設定することを推奨します。
エンジンの選び方
FUNBREW PDFには2つのレンダリングエンジンがあります。リクエストごとに切り替え可能です。
| エンジン | パラメータ | 特徴 | おすすめ用途 |
|---|---|---|---|
| Fast | "engine": "fast" |
高速、軽量 | シンプルなHTML、大量生成 |
| Quality | "engine": "quality" |
高品質、CSS完全対応 | デザイン重視、CSS Grid使用 |
エンジンの技術的な違いについてはwkhtmltopdf vs Chromiumで詳しく解説しています。
よくある質問
HTMLに外部CSSやWebフォントを使える?
はい。<link>タグで外部CSSを読み込めます。Google FontsなどのWebフォントも利用可能です。ただし、外部リソースの読み込み分だけ生成時間が長くなるため、本番ではインラインスタイルかセルフホストフォントを推奨します。
画像はBase64とURLのどちらがいい?
小さなアイコンやロゴ(50KB以下)はBase64エンコードでHTMLに埋め込むのが確実です。大きな画像はURL参照の方がリクエストサイズを抑えられます。URL参照の場合、画像サーバーが外部からアクセス可能である必要があります。
生成されたPDFのファイルサイズを小さくするには?
engine: "fast"を使うとファイルサイズが小さくなります。また、画像の解像度を必要最小限にする、不要なWebフォントを削除する、CSSを簡潔にするなどの工夫が効果的です。
次のステップ
基本的なPDF生成ができたら、以下の機能も試してみてください。
- テンプレートエンジン: HTMLテンプレートに変数を埋め込んで動的PDF生成
- 請求書の自動生成: テンプレート+バッチAPIで月次請求を自動化
- Playground: ブラウザ上でリアルタイムにPDF生成をテスト
- APIリファレンス: 全エンドポイントの仕様を確認
関連リンク
- PDF API本番運用チェックリスト — 開発から本番投入までのチェックリスト
- HTML to PDF API比較 2026年版 — 主要サービスとの機能比較
- PDF APIセキュリティガイド — APIキー管理とセキュリティ対策
- wkhtmltopdf vs Chromium — エンジン選択の技術解説
- PDF APIエラーハンドリング完全ガイド — エラー処理のベストプラクティス
- PDF APIバッチ処理ガイド — 大量PDF生成の並行処理
- TypeScript向けPDF APIガイド — TypeScriptでの型安全な実装
- Django・FastAPI向けPDF APIガイド — Pythonフレームワークとの統合
- Next.js・Nuxt向けPDF APIガイド — フロントエンドフレームワークとの連携
- Ruby・Go クイックスタート — Ruby・Goのコードサンプル
- Puppeteer移行ガイド — PuppeteerからAPI移行の手順
- APIリファレンス — エンドポイントの詳細仕様