"Best JavaScript PDF library" has no answer, because these libraries do different jobs. GitHub stars will not tell you which job is yours. This page sorts them by what you are trying to do, and says where Polotno fits and where it does not.
Start with the verb, not the library
Displaying a PDF
pdf.js. Mozilla's renderer, the engine inside Firefox's viewer, and the parsing layer in Polotno's own importer. Its viewer also has annotation editors and form filling. If the job is "show a document to a user", stop here.
Modifying an existing PDF
pdf-lib. Edits at the document-object level, so form fields, bookmarks, and internal links survive an in-place edit. The right pick when the input file's structure must be preserved. Its latest release is from November 2021, and @cantoo/pdf-lib is an MIT fork with 2026 releases. See the detailed comparison.
Drawing a PDF from code
PDFKit and jsPDF. Imperative drawing APIs that run in Node and the browser. Ideal when a developer owns a fixed layout that comes out of data and never passes a designer. See the PDFKit comparison.
Turning HTML into a PDF
Puppeteer, or WeasyPrint outside Node. The right answer when you are capturing a real page or rendering flowing text you already maintain as HTML. Skip wkhtmltopdf for new work: its repository was archived in January 2023. See the Puppeteer comparison.
Letting users design a document
Polotno SDK. A visual editor plus a JSON schema that imports and exports PDF. The pick when a non-developer authors the layout, or when your users redesign documents inside your product. See PDF SDK.
Signing, redacting, or running OCR
Nutrient (formerly PSPDFKit) or Apryse. Commercial document platforms with annotation, AcroForms, digital signatures, redaction, OCR, and native mobile SDKs. Both also edit text inside the PDF as an add-on. pdf.js covers annotation and form filling in the browser, so look here when you need digital signatures, redaction, OCR, in-place text edits, or native mobile.
The distinction people get wrong most often
Generating a PDF and editing a PDF are not the same problem, and most of the confusion in this category comes from treating them as one.
Generating means producing a document from data. PDFKit, jsPDF, Puppeteer, and Polotno all do it, and they differ on who writes the layout: a developer in code, a developer in HTML, or anyone in an editor.
Editing means opening a file someone else made and changing it. pdf-lib does it structurally, preserving what was there. Polotno does it visually, by reinterpreting the page as a design. Those produce different results and neither is a substitute for the other.
Where Polotno does not fit
- No OCR. A scanned document imports as images with no text to edit, and an invisible OCR layer is dropped.
- No interactive forms. Form-field text imports as static text elements; the fields stop being fillable.
- No annotation layer. No comments, highlights, or markup.
- No redaction or digital signatures. Deleting an element is an edit, which redaction is not.
- No native mobile SDK. Polotno reaches iOS and Android through a WebView, and you maintain the bridge.
- No HTML input. It renders its own schema, not arbitrary markup.
- No Java, .NET, or Python bindings. Polotno's packages are JavaScript and TypeScript. Other backends can render through the Cloud Render API over REST.
If one of those is a hard requirement, another library on this page is your answer.
A quick decision path
- Do users need to see a PDF, or mark it up in the browser? → pdf.js
- Do you need digital signatures, redaction, OCR, in-place text edits, or native mobile? → Nutrient or Apryse
- Do you need an existing file's structure intact? → pdf-lib, or its fork
- Is the layout fixed and developer-owned? → PDFKit or jsPDF
- Is the source HTML? → Puppeteer or WeasyPrint
- Does a non-developer own the design, or do your users edit it? → Polotno
FAQ
Which library is most popular?
Over the past 12 months on npm, pdf.js leads and jsPDF comes second. Popularity tracks how common the job is, not how well any of them fits yours.
Can one library do everything?
No. Apryse comes closest. Plan on two: one for viewing or structural work, one for generating.
Are the open-source ones production ready?
pdf.js, PDFKit, jsPDF, and Puppeteer all shipped releases in 2026. pdf-lib stays widely installed, but its latest release is from November 2021, so weigh that and look at the fork. pdf.js and jsPDF both published security advisories in 2026, so stay on a patched version.
Where does Polotno's PDF support come from?
Polotno's PDF import parses files with pdf.js, then turns them into editable text, images, and vector paths on a canvas. Its PDF export writes vector PDF including PDF/X. See PDF import and PDF export, and test both with the 30-day free trial, no credit card needed.
