lamina
lamina creates, reads, edits and saves PDFs. One Rust core does the work. It runs natively, and as WebAssembly in browsers, Node, Deno, Bun and Cloudflare Workers. It takes bytes and gives back bytes: it doesn’t touch the file system or the network, and it reads no clock.
laminais the Rust crate:Document::open_bytes,Builder, saving and jobs you can cancel.@lamina/pdfis the TypeScript API over the WebAssembly build. After oneawait init(), every call is synchronous, and the API is the same in every runtime.
What it does today
Section titled “What it does today”| Area | What you get | Guide |
|---|---|---|
| Generate | Pages, text with shaping, bidi and line breaking, embedded and subset fonts, the standard 14, vectors, colour, images, tagged PDF | Fonts and text, Images and vectors |
| Navigate | Links, named destinations, outlines, page labels, Info and XMP metadata | Links, outlines and metadata |
| Edit | Ops in transactions, undo and redo, incremental or full saves that respect signatures | Open, edit and save |
| Read safely | Repair of damaged files as warnings, resource limits, strict mode, passwords (R2–R6) | Encrypted files, Limits |
| Errors | One coded error and warning shape on every surface | Errors and warnings |
Each code block on this site is one of the repository’s tested example files, loaded when the site is built, so the code shown is the code that runs. Every example produces the same bytes in Rust and in each JavaScript runtime. Browse them in the examples gallery.
Start here
Section titled “Start here”Pick your runtime: browser or bundler, Node, Deno, Bun, Cloudflare Workers or Rust.