LibPDF.js: TypeScript PDF Library for Parsing & Signing
LibPDF.js: The Complete TypeScript PDF Solution
If you’ve ever needed to read, edit, or generate PDFs in a JavaScript environment, you’ve probably chased your tail through a maze of libraries: - PDF.js is excellent for rendering but forces you to the browser. - pdf‑lib has a slick API but struggles with the quirks of real‑world PDFs. - pdfkit will generate PDFs but won’t read them.
Enter LibPDF.js – a modern, browser‑and‑server‑ready PDF engine written entirely in TypeScript. Designed by Documenso, an open‑source DocuSign alternative, it fills the gaps left by the other libraries: it opens every PDF the web can throw at it, offers a clean API, and supports the full PDF feature set you’ll need for production.
What Can LibPDF.js Do?
| Feature | Availability | Notes |
|---|---|---|
| Parse any PDF | ✔️ | Lenient parsing supports malformed files, fallback recovery, and full position data |
| Create PDFs | ✔️ | From scratch or modify an existing file |
| Encryption | ✔️ | RC4, AES‑128, AES‑256 (R2‑R6) |
| Digital Signatures | ✔️ | PAdES B‑B, B‑T, B‑LT, B‑LTA; Google Cloud KMS integration |
| Form Filling | ✔️ | Text, checkbox, radio, dropdown, signature |
| Form Flattening | ✔️ | Bake fields into page content |
| Merge & Split | ✔️ | Combine or extract pages |
| Attachments | ✔️ | Embed and extract files |
| Text Extraction | ✔️ | With coordinates |
| Font Embedding | ✔️ | TTF/OpenType with subsetting |
| Images | ✔️ | JPEG, PNG (alpha), JBIG2 & JPEG2000 passthrough |
| Incremental Saves | ✔️ | Append changes; keep existing signatures |
Why this matters – The combination of leniency, a clean API, and a full feature set means you can build enterprise‑grade e‑signature or document‑generation workflows without reinventing the wheel.
Installation & Quick Start
# npm
npm install @libpdf/core
# bun
bun add @libpdf/core
import { PDF } from "@libpdf/core";
// Load a PDF from a buffer
const pdf = await PDF.load(fileBytes);
// Simple read
const pages = pdf.getPages();
console.log(`Document has ${pages.length} pages.`);
// Create a brand‑new PDF
const newPdf = PDF.create();
const page = newPdf.addPage({ size: "letter" });
page.drawText("Hello, World!", { x: 50, y: 700, fontSize: 24 });
// Signing example
import { P12Signer } from "@libpdf/core";
const signer = await P12Signer.create(certificateBytes, "certPassword");
const signed = await pdf.sign({ signer, reason: "I approve this doc" });
API Highlights
High‑Level API
PDF– Load, merge, create, and write documents.PDFPage– Manipulate individual pages (draw text, images, annotations).PDFForm– Read, populate, or flatten form fields.
Low‑Level API
PdfDict,PdfArray,PdfStream– Full control if you need to touch the raw PDF structure.
Why LibPDF.js Over Others?
| Aspect | LibPDF.js | PDF.js | pdf‑lib | pdfkit |
|---|---|---|---|---|
| Browser or Node support | ✔️ (Web Crypto + Node 20+) | ✔️ (renderer only) | ✔️ | ✔️ |
| Lenient parsing | ✔️ | ❌ | ❌ | ❌ |
| Digital signatures | ✔️ | ❌ | ✅ (basic) | ❌ |
| Form support | ✔️ | ❌ | ❌ | ❌ |
| Incremental save | ✔️ | ❌ | ❌ | ❌ |
If you need a library that just works with real‑world PDFs while offering a smooth developer experience, LibPDF.js wins.
Community & Contribution
The repository is actively maintained on GitHub with 717 stars, 19 forks, and a growing contributor base. Documentation lives at https://libpdf.dev, and the core library is published to npm as @libpdf/core.
- Contributing guide – See
CONTRIBUTING.mdin the repo. Bug fixes, feature requests, and documentation improvements are always welcome. - Roadmap – Upcoming work includes signature verification, support for TrueType Collections, and rendering support in browsers.
Practical Use Cases
- E‑signature platforms – Quickly add PAdES support and incremental signing.
- Document generation – Generate PDFs from templates, populate forms, embed fonts and images.
- PDF analytics – Extract text with layout information for search or indexing.
- Compliance workflows – Merge documents, apply encryption, and flatten forms.
Final Thoughts
LibPDF.js brings the power of PDF manipulation to modern JavaScript developers with a TypeScript‑first experience. Whether you’re building a legal‑tech stack, a custom billing system, or a simple PDF viewer, it provides the tools you need without the friction of other libraries.
Try it today – npm install the package, run the quick‑start snippets, and see how fast you can get started with robust PDF handling.