fastify-xpdf
generateFromHtml
Convert an HTML string to PDF using Puppeteer (Chrome headless).
generateFromHtml
Convert an HTML string to a PDF buffer using a Puppeteer-managed Chrome headless browser. Supports page format, orientation, margins, headers/footers, and optional upload to xStorage.
Signature
fastify.xPDF.generateFromHtml(
html: string,
options?: HtmlPdfOptions,
): Promise<PdfResult>
interface HtmlPdfOptions {
filename?: string
format?: string // "A4", "Letter", "A3", "A5", "Tabloid", etc.
landscape?: boolean
margin?: { top?: string; right?: string; bottom?: string; left?: string }
printBackground?: boolean
displayHeaderFooter?: boolean
headerTemplate?: string // HTML string for header
footerTemplate?: string // HTML string for footer
saveToStorage?: boolean // upload via xStorage
folder?: string // storage folder override
}
interface PdfResult {
buffer: Buffer
filename: string
size: number // bytes
storageKey?: string // present if saveToStorage: true
url?: string // present if saveToStorage: true
}
Params
| Name | Type | Required | Description |
|---|---|---|---|
html | string | Yes | HTML content to render — must be a non-empty string |
options.filename | string | No | Output filename (auto-generated with timestamp if omitted) |
options.format | string | No | Page format override (defaults to plugin format option) |
options.landscape | boolean | No | Landscape orientation |
options.margin | object | No | Page margins override (CSS units, e.g. "1cm") |
options.printBackground | boolean | No | Background colours/images (defaults to plugin setting) |
options.displayHeaderFooter | boolean | No | Enable header/footer |
options.headerTemplate | string | No | HTML for the page header |
options.footerTemplate | string | No | HTML for the page footer |
options.saveToStorage | boolean | No | Upload result buffer to xStorage |
options.folder | string | No | Storage folder (defaults to plugin defaultFolder) |
Returns
PdfResult — always includes buffer, filename, and size. Includes storageKey and url when saveToStorage: true and xStorage is registered.
Throws
| Error | When |
|---|---|
[xPDF] HTML content must be a non-empty string | html is empty, null, or not a string |
[xPDF] Failed to initialize PDF browser | Puppeteer/Chrome launch failure |
Examples
Generate and stream a PDF response
fastify.get("/invoices/:id/pdf", async (request, reply) => {
const invoice = await fastify.prisma.invoice.findUnique({
where: { id: request.params.id },
});
const html = `
<!DOCTYPE html>
<html>
<head><style>body { font-family: sans-serif; padding: 2cm; }</style></head>
<body>
<h1>Invoice #${invoice.number}</h1>
<p>Due: ${invoice.dueDate}</p>
<p>Total: $${invoice.total}</p>
</body>
</html>
`;
const { buffer, filename } = await fastify.xPDF.generateFromHtml(html, {
format: "Letter",
filename: `invoice-${invoice.number}.pdf`,
});
return reply
.header("Content-Type", "application/pdf")
.header("Content-Disposition", `attachment; filename="${filename}"`)
.send(buffer);
});
Generate with header/footer and save to storage
const { url } = await fastify.xPDF.generateFromHtml(reportHtml, {
format: "A4",
landscape: true,
displayHeaderFooter: true,
headerTemplate: `<div style="font-size:10px;text-align:right;width:100%;padding-right:1cm;">
<span class="date"></span>
</div>`,
footerTemplate: `<div style="font-size:10px;text-align:center;width:100%;">
Page <span class="pageNumber"></span> of <span class="totalPages"></span>
</div>`,
saveToStorage: true,
folder: "reports/2025",
});
console.log(url); // public CDN URL of the uploaded PDF
See Also
- generateFromMarkdown — Markdown → PDF
- generateFromUrl — Live URL → PDF
AI Context
package: "@xenterprises/fastify-xpdf"
method: fastify.xPDF.generateFromHtml(html, options?)
use-when: Convert an HTML string to PDF using Puppeteer (Chrome headless)
params: html (string), options (format, margin, printBackground, saveToStorage, filename, folder)
returns: { buffer, size } | { buffer, size, storageKey, url } (when saveToStorage: true)
