Comparison · jsPDF
jsPDF, or a laid-out document?
jsPDF is the shortest path from a browser to a PDF, and for a receipt, a label or a one-page form it is the right answer. The difference arrives on the second page. jsPDF draws where you tell it and never measures, so everything that depends on knowing the height of what you are about to draw is yours to work out: keeping a heading with its paragraph, holding a chart on one page, repeating a table header, printing "page 3 of 7" at all.
Choose jsPDF when
- The document is short and fixed, and a developer is content to place it
- You want a small MIT-licensed dependency in the browser and nothing running on a server
- You are drawing at coordinates — a receipt, a label, a certificate — rather than laying out prose
Choose BroadPaper when
- Users design the document, and every customer wants its own branding
- It runs to several pages, so headings, tables and charts have to survive the breaks
- Charts must stay sharp and their labels searchable, rather than being pasted in as a bitmap
- It has to be tagged, or carry a title and a language, because whoever procures it will ask
Side by side
| jsPDF | BroadPaper | |
|---|---|---|
| Who builds the document | A developer, in imperative calls: text(), rect() and addImage() at coordinates, with splitTextToSize() to wrap a paragraph. | An embeddable visual designer your users work in: drag, bind to your data, brand, preview. React and Angular wrappers over one framework-free mount API. |
| Layout | None. You keep the cursor yourself, measure with getTextWidth(), and call addPage() when you judge the page full. | Blocks laid out as the browser lays text out, then measured as one continuous galley before any page boundary is chosen. |
| Pagination | Yours to write. The jspdf-autotable plugin adds it for tables, including repeated headers. | BroadPaper's own paginator: keep-together, keep-with-next, orphans and widows, repeated table headers, explicit breaks and multi-column splits, decided before any PDF backend draws a page. |
| Tables | The separate jspdf-autotable plugin: page breaks, repeated headers, column widths and cell hooks. | A table block with repeated headers, totals and column widths, measured a batch of rows at a time so ten thousand rows still break where they should. |
| Charts and SVG | No SVG in core; svg2pdf.js is a separate plugin. The .html() helper renders through html2canvas, which rasterises the page. | Charts are SVG, translated to vector paths with their labels drawn as real text — sharp at any zoom, and searchable in the finished file. |
| Images | addImage() takes a compression argument, and without one the bitmap is embedded uncompressed. | Charts, logos and rules are vector rather than bitmaps, so the usual reason a generated PDF weighs megabytes does not arise. |
| Fonts | The fourteen standard PDF faces unless you add a TrueType font through the virtual file system. | Declared once in theme.fonts, and the same TrueType bytes both measure the layout and draw the file, so the PDF matches the preview. |
| Accessibility and metadata | No tagged-PDF, PDF/UA or PDF/A output. | Tagged output, PDF/UA-1 and PDF/A are options, and the title, author, subject and language are set from the template. |
| Where the PDF is made | Browser or Node. | Browser or Node through a WebAssembly engine, or a render service over HTTP with a .NET client. |
| Licence | MIT, free. | Commercial, per organisation, yearly. Free to evaluate with every feature; PDFs carry an evaluation mark until licensed. No seats, no activation, no telemetry. |
jsPDF code is a sequence of drawing calls and a BroadPaper report is data — a JSON template with bindings — so nothing converts between them. Teams usually leave the fixed receipt where it is and reach for BroadPaper for the document that outgrew being placed by hand.
What other products do is summarised from their own sites, checked 16 September 2026: jsPDF on GitHub, jsPDF API documentation, jspdf-autotable, svg2pdf.js. Tell us at hello@broadpaper.com if something here has changed.
See it before you decide.
The demo is the whole designer, in your browser, with no account and nothing uploaded — and the quick start is thirty lines to a designer in your own app.