Enterprise PDF for Node.js & TypeScript

The enterprise PDF library
Node doesn't have.

Generate archival PDF/A, sign documents with PAdES, encrypt with AES-256 and produce accessible PDF/UA from Node.js or TypeScript. One memory-safe core, the same behavior as every other binding, running entirely on your servers: no per-document SaaS fees, no data leaving your network, no AGPL strings.

Install from npm. Prebuilt native binaries per platform, no node-gyp.
npm install rustpdf
Validated by independent tools: veraPDFpdfsigopenssl cmsqpdfmutool

Why Node teams pick rust-pdf

The usual way to make a "real" PDF from Node is to render HTML in headless Chrome with Puppeteer. It works until production: gigabytes of RAM per worker, cold starts, and still no PDF/A, no qualified signatures, no PDF/UA. The alternative is a per-document SaaS that uploads your customers' documents.

rust-pdf is one npm install with prebuilt native binaries (no node-gyp), TypeScript types included, and a single offline license that unlocks the corporate features. Replace a fleet of heavy HTML→PDF servers with a 22 MB native core.

  • No headless Chrome: drop Puppeteer and the gigabytes of RAM it needs per worker.
  • Runs on your servers: documents never leave your network and nothing phones home, ideal for LGPD/GDPR, fintech and health.
  • No AGPL trap: a commercial per-application license, never the AGPL of iText or the per-server billing of Aspose.
  • Typed & deterministic: ships index.d.ts, and the same input always produces the same bytes.
  • Free to build with: everyday PDF generation is free forever; you only license the regulated-grade features.

Free to build with. Licensed when you ship.

Prototype and generate everyday PDFs for free. When you need archival, signatures, encryption or accessibility, one license unlocks them all in Node and every other binding.

Community free

  • Pages & vector graphics
  • Embedded/subset fonts, Unicode shaping
  • Justified paragraphs & tables
  • Images (JPEG/PNG/alpha/16-bit)
  • Merge / split / rotate
  • Text extraction & optimize

Corporate licensed

  • PDF/A: 1b / 2b / 2a / 3b / 3a / 4 / 4e / 4f archival
  • Digital signatures: PKCS#7, visible & multiple
  • PAdES: B-B / B-LT / B-LTA + RFC 3161 timestamps
  • Encryption: RC4 / AES-128 / AES-256 (R6)
  • Accessibility: Tagged PDF / PDF/UA-1
  • AcroForm: fields with generated appearances

Try every licensed feature free for 5 days.

Get a trial token by email and unlock PDF/A, digital signatures, encryption and accessibility in Node.js. No account, no card required.

Author a PDF/A and encrypt it in a few lines of Node

// npm install rustpdf
const { Document, EditableDoc, Encryption, PdfaLevel } = require("rustpdf");

const doc = new Document();
doc.pdfa(PdfaLevel.A2b).setInfo({ title: "Q3 Report" });
const f = doc.addFontFile("Roboto-Regular.ttf");
doc.addPage();
doc.showText(f, 26, 72, 760, "Invoice #1024");
const bytes = doc.toBytes();           // archival-grade PDF

// Encrypt with AES-256 (same offline license unlocks every feature):
const ed = EditableDoc.load(bytes);
ed.encrypt({ owner: "owner-secret", method: Encryption.Aes256 });
ed.save("secured.pdf");

The full Node / TypeScript reference (fonts, images, forms, manipulation, encryption and signatures) lives in the Node docs.

Fits Express, Nest and serverless functions

toBytes() hands you a Node Buffer, so returning a PDF is res.type("application/pdf").send(buf) in Express, a StreamableFile in NestJS, or the body of a Lambda / Cloud Functions response. You delete the Puppeteer fleet and the gigabytes of RAM it needed per worker.

npm install rustpdf pulls prebuilt native binaries per platform with no node-gyp, and ships index.d.ts so TypeScript gets full types. It works the same from CommonJS require and ESM import.

// Express: stream a PDF/A as the response
import express from "express";
import { Document, PdfaLevel } from "rustpdf";

const app = express();
app.get("/invoice.pdf", (_req, res) => {
  const doc = new Document();
  doc.pdfa(PdfaLevel.A2b);
  const f = doc.addFontFile("Roboto-Regular.ttf");
  doc.addPage();
  doc.showText(f, 18, 72, 760, "Invoice #1024");
  res.type("application/pdf").send(doc.toBytes());
});

Common PDF tasks in Node.js

Focused, copy-paste guides in JavaScript and TypeScript, all on the same Rust core. Each one mirrors the API you already saw above.

Start building in Node.js

npm install rustpdf and ship your first archival PDF today. Free for everyday generation; license the corporate features when you go to production.

Node.js PDF library FAQ

Does it need node-gyp or a native build step?

No. The package ships prebuilt native binaries per platform and loads them through a pure-FFI layer (Koffi), so npm install rustpdf never compiles anything. There is no Chromium download and no Puppeteer dependency.

Does it work with TypeScript, ESM and CommonJS?

Yes. It ships an index.d.ts for full TypeScript types and exports work from both require (CommonJS) and import (ESM). The same Document / EditableDoc shape is used either way.

Is it a good fit for serverless and containers?

Yes. The native core is small and runs fully offline, so cold starts stay low and no document leaves your function. Compared with a headless-Chrome approach, memory per invocation drops sharply, which matters on Lambda and Cloud Run.