Skip to Content
PDFAPI route handler

API route handler

createHtmlToPdfHandler — POST handler that renders HTML with Puppeteer and returns application/pdf.

Default export

import htmlToPdfPostHandler from '@sumx/ssr-pdf/next/html-to-pdf-handler'; export default htmlToPdfPostHandler; // env-based defaults

Prefer createHtmlToPdfHandler when you need custom inline-disposition rules.

Factory

import { createHtmlToPdfHandler, htmlToPdfApiRouteConfig, } from '@sumx/ssr-pdf'; const handler = createHtmlToPdfHandler({ isInlineDispositionAllowed: (req) => { const host = req.headers.host ?? ''; return host.endsWith('.sumx.app'); }, }); export default handler; export const config = htmlToPdfApiRouteConfig;

HtmlToPdfApiConfig

OptionDescription
isInlineDispositionAllowedRequired for disposition: 'inline'; default allows SumX dev hosts

Route config

export const htmlToPdfApiRouteConfig = { api: { bodyParser: { sizeLimit: '5mb' }, responseLimit: false, }, } as const;

Portal pattern (Next 16):

export { default } from '@sumx/ssr-pdf/next/html-to-pdf-handler'; export const config = { api: { bodyParser: { sizeLimit: '5mb' }, responseLimit: false, }, };

Request flow

  1. Validate method POST and JSON body (request utilities).
  2. Acquire render slot (concurrency cap).
  3. Launch/reuse Puppeteer, setContent(html), page.pdf(...).
  4. Release slot; return PDF buffer with Content-Disposition.

Response headers

  • Content-Type: application/pdf
  • Content-Disposition: attachment or inline + sanitized filename

Errors

StatusTypical cause
400Invalid body, HTML too large, bad orientation
403inline not allowed for Host
405Non-POST
500Puppeteer/Chromium failure (logged server-side)

Debugging

Set HTML_TO_PDF_DEBUG=true for structured request logs (see Configuration).