Vercel2026-07-02

【インフラ】サーバーレス環境で大容量PDF出力をスマートに解決する、Vercel SandboxとPuppeteerを活用した請求書自動生成パターン


サーバーレス環境でのPDF出力における「リソース」の壁

毎月の請求書、見積書、あるいは分析レポートのPDF自動作成。これはB2Bの業務自動化プロセスにおいて非常に頻度の高いタスクです。

Webシステム開発では、デザインの容易さから「HTMLとCSSで帳票のレイアウトを作成し、それをヘッドレスブラウザ(Puppeteerなど)でPDFとして出力(印刷)する」という実装方法がベストプラクティスとして知られています。

しかし、このアプローチをVercelの通常のAPI(Serverless Functions)で実行すると、以下の問題が解決できません。

  1. メモリ消費の大規模なスパイク: ブラウザ(Chromium)を起動してページを描画する処理は、CPUとメモリを大量に消費するため、複数のリクエストが重なった際にファンクションがクラッシュする。
  2. 容量制限による起動失敗: Serverless Functionsのパッケージサイズ制限(Proプランで50MB以下)にChromiumバイナリが収まらず、別途外部の巨大なバイナリロード用パッケージ(@sparticuz/chromium)を手動で動的ロードするなどの複雑なワークアラウンドが必要。
  3. 日本語フォントのレンダリング崩れ: サーバーレス環境に日本語フォントがプリインストールされていないため、出力されたPDFの文字が豆腐(□□□)に化ける。

これらの問題をスマートにクリアするために、永続Node.js実行環境を提供する Vercel Sandbox にあらかじめフォントとブラウザをセットアップしておき、安定してPDFを大量出力するサーバー構成を導入します。


2. 課題解決のビフォー・アフター

項目 一般的なServerless APIでのPDF生成(Before) Vercel Sandbox+Puppeteer構成(After)
フォント対応 日本語文字化け(豆腐化)が発生しやすい Sandboxコンテナに日本語フォントを恒久的にインストール可能
起動安定性 Chromiumのロード遅延により稀に起動エラーが発生 バックグラウンドでコンテナが常に安定してブラウザを操作可能
メモリ上限 1024MBの制限に引っかかりファンクションが即死 十分なメモリリソースを割り当て、複数ページのPDFも出力可能
PDFの品質 CSSの印刷メディア特性が一部無視される 完全なレンダリング結果をドロップインで再現

3. 具体的な実装例:Sandbox上でのHTMLからPDFへの変換スクリプト

HTML文字列を受け取り、Puppeteerを用いて印刷用の高品質なPDFバイナリを出力する処理コード例です。

import puppeteer from "puppeteer-core";

export async function generatePdfFromHtml(htmlContent: string): Promise<Buffer> {
  let browser = null;
  try {
    browser = await puppeteer.launch({
      args: [
        "--no-sandbox",
        "--disable-setuid-sandbox",
        "--font-render-hinting=none", // フォントの描画の粗さをクリアにする
      ],
      // Vercel Sandboxコンテナ上のChromiumパスを指定
      executablePath: process.env.CHROMIUM_PATH || "/usr/bin/chromium-browser",
      headless: true,
    });

    const page = await browser.newPage();

    // 1. HTMLコンテンツをページにセット
    await page.setContent(htmlContent, { waitUntil: "networkidle0" });

    // 2. 印刷用CSS(A4サイズ)に最適化したPDFを生成
    const pdfBuffer = await page.pdf({
      format: "A4",
      printBackground: true, // 背景色や背景画像を適用
      margin: {
        top: "20mm",
        right: "15mm",
        bottom: "20mm",
        left: "15mm",
      },
    });

    return Buffer.from(pdfBuffer);
  } catch (error) {
    console.error("PDF generation pipeline failed:", error);
    throw error;
  } finally {
    if (browser) {
      await browser.close();
    }
  }
}

4. HadayaLabの帳票自動化システム開発

HadayaLabでは、毎月の「請求作業」や「顧客レポート送付」の手作業を完全にゼロにするための、エンタープライズ向けPDF自動生成パイプラインの導入を支援しています。

  • 請求情報DBと連携した自動PDF出力: 月末の決まった日時に、データベースから明細を引き抜き、自動的に請求書PDFを作成して各クライアントにメール自動送付。
  • 日本語フォント・レイアウト調整: 各種Webフォントの埋め込みによる、美しく崩れないコーポレートデザインの再現。
  • Google Drive / 電子帳簿保存法対応ストレージへの自動アーカイブ: 生成されたPDFファイルを、電子帳簿保存法の要件(検索日付、取引先名、金額メタデータ付与)に沿ってGoogle Driveへ自動分類保存。

「毎月数百件の請求書作成を手動でPDF化し、手動でメール添付して送信している」というバックオフィス責任者様は、ぜひHadayaLabの「請求帳票オートメーション」をご相談ください。