NaN/NaN/NaN

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生成ができたら、以下の機能も試してみてください。

関連リンク

Powered by FUNBREW PDF