How does Forme compare to react-pdf?
Both use React components to define PDF layouts. The key difference is the layout engine. react-pdf lays out content on an infinite canvas and slices it into pages, which breaks flex layouts and tables at page boundaries. Forme’s engine is page-native, so every layout decision accounts for the page boundary from the start. Forme also has built-in table header repetition, a dev server with live preview, and faster render times. See the full migration guide for details.How does Forme compare to Puppeteer for PDF generation?
Puppeteer launches a headless Chrome browser to render HTML to PDF. This gives you full CSS support, but a cold browser costs seconds to start (and can’t boot at all on many serverless tiers), each process holds 50-200MB, and the Docker image is 400MB+. Forme renders directly to PDF via a WASM module — a typical document in roughly 15-25ms with no browser dependency. On identical HTML, Forme is dramatically faster to cold-start and about 2x faster on typical documents; on very large table-heavy documents Puppeteer is faster (see the measured numbers below). The tradeoff is that Forme renders the documented HTML/CSS subset or JSX templates rather than arbitrary browser CSS. See the Puppeteer replacement guide and the measured benchmarks for details.Can I use Forme in serverless (AWS Lambda, Vercel, Cloudflare Workers)?
Yes. Measured cold start — process/isolate start through the first PDF byte — is roughly 60ms on a Cloudflare Workers isolate and ~110ms on Node; the ~7.1MB WASM module itself compiles and instantiates in only 1-10ms, so cold start is dominated by first-render warmup, not module size. There is no Chromium binary to bundle, no native dependencies to compile, and no subprocess to manage — and Forme runs on consumption tiers where a headless browser cannot boot at all. See the per-runtime cold-start numbers. Note the Workers 128MB memory ceiling: table-heavy documents render comfortably up to ~50 pages and approach the limit near ~100; beyond that, use Node.Does Forme support custom fonts?
Yes. Forme embeds TrueType (.ttf) fonts directly into the PDF with automatic subsetting (only the glyphs your document uses are included). Register fonts by providing a file path or data URI.Does Forme support images?
Yes. Forme supports JPEG and PNG images, including PNG transparency. Provide images as file paths or base64 data URIs. Aspect ratio is preserved when you specify only one dimension. See the Image component docs.Does Forme support SVG?
Yes. The<Svg> component renders SVG markup directly into the PDF as vector graphics (not rasterized). Supported elements include rect, circle, ellipse, line, polyline, polygon, and path with opacity, fill-opacity, and stroke-opacity support. You can pass SVG as a content string or as JSX children. Advanced SVG features like filters, gradients, and masks are not yet supported. See the Svg component docs.
Does Forme support tables with header repetition?
Yes. This is one of Forme’s core features. Add theheader prop to a <Row> inside a <Table>, and that row automatically repeats at the top of every continuation page when the table spans multiple pages. No workarounds or manual pagination needed. See page breaks.
How fast is Forme?
It depends on the document, and we publish the full measured numbers rather than a single figure. A typical invoice, receipt, or short report renders in roughly 15-25ms (warm, dev machine). Cost scales with the document: a 50-page statement is about 0.5s and a 500-page ledger several seconds. Against Puppeteer on byte-identical HTML, Forme is dramatically faster to cold-start (tens of ms vs seconds) and ~2x faster on typical documents, but slower on very large table-heavy documents — a 500-page ledger is ~3.8x slower than Chrome, which we report honestly. Per-document, per-runtime figures (native, Node, browser, Workers, and the Puppeteer baseline) are at parity.formepdf.com/#benchmarks.Can I generate PDFs in the browser?
Yes. Import@formepdf/core/browser instead of @formepdf/core. The same WASM engine runs client-side with no server required. Font URLs are fetched via fetch() instead of the filesystem, and decompression uses the browser-native DecompressionStream API. Works with Vite, Next.js, Remix, or any bundler that handles WASM.
Does Forme work with Next.js?
Yes. UserenderDocument() from @formepdf/core in API routes, server actions, or getServerSideProps. Since Forme runs in-process as WASM, there is no external service or subprocess to manage. It works in both the Pages Router and App Router.
Does Forme work with Express?
Yes. CallrenderDocument() in any Express route handler and send the resulting Uint8Array as the response. See the Puppeteer replacement guide for a complete Express example.
What languages does Forme support?
Forme supports any language that uses a left-to-right writing system and can be rendered with a TrueType font. This covers Latin, Cyrillic, Greek, CJK (Chinese, Japanese, Korean), and many other scripts. Right-to-left languages (Arabic, Hebrew) are supported with automatic direction detection. Mixed LTR/RTL paragraphs reorder correctly.Is there a VS Code extension?
Yes. Search for “Forme PDF Preview” in the VS Code Extensions view. It provides a live PDF preview, a component tree with hover-to-highlight, and an inspector panel with box model visualization and source navigation. See the VS Code extension docs for details.Can I embed structured data inside a PDF?
Yes. PassembedData when rendering to attach any JSON object as a hidden file attachment. The PDF looks identical — the data is invisible to viewers but extractable with extractData(). This makes PDFs self-describing: invoices carry their line items, reports carry their datasets. See the embedded data guide.
Is there a hosted API?
Not anymore — the hosted service was retired when Forme went open-source only. Everything renders locally vianpm install, or over HTTP via the self-hosted server (docker run formepdf/forme), which serves the same /v1 endpoints. See the API reference.
How do I upload PDFs to S3?
Pass ans3 object in the render request body with your bucket name, key, credentials, and region. Forme uploads the rendered PDF directly to your S3-compatible bucket and returns the URL. This works with AWS S3, Cloudflare R2, MinIO, and DigitalOcean Spaces. See the S3 upload docs for examples.
Is Forme free?
Yes — entirely. Everything is open source under the MIT license: the engine, every adapter, every SDK, and the self-hosted server. There are no plans, no tiers, no render limits, and nothing calls home. Use it in personal and commercial projects without restrictions.Does Forme support fillable PDF forms?
Yes. Forme includes AcroForm components —<TextField>, <Checkbox>, <Dropdown>, and <RadioButton> — for creating interactive fillable PDFs. You can also flatten forms at render time to convert filled fields to static content. See the Forms guide for details.
Is Forme accessible / screen reader compatible?
Yes. Enable PDF/UA-1 compliance with<Document pdfUa>. Forme automatically generates the structure tree, tab order, role map, and artifact tagging required for screen readers. Add alt text to images for full accessibility. See the Accessibility guide.
Can I generate archival PDFs?
Yes. Forme supports PDF/A-2b and PDF/A-2a for long-term document preservation. Enable it with<Document pdfa="2b">. Forme handles font embedding, sRGB output intent, and XMP metadata automatically. See the Archival guide.
Does Forme support digital signatures?
Yes. Forme can apply PKCS#7 detached digital signatures using X.509 certificates. Certify at render time via thecertification prop on <Document>, or certify an existing PDF via the /v1/certify API endpoint. See the Digital Certification guide.