MuPDF.js
Artifex's WebAssembly build of the MuPDF engine for JavaScript and browsers.
Operated by Artifex Software, Inc.
Opens the vendor's own site.
Jobs covered
Open a task to see exactly what the vendor documentation supports.
Edit
Browse all edit toolsediting annotations and PDF structure with MuPDF.js, where the annotations documentation documents creating annotations with page.createAnnotation() and deleting them with page.deleteAnnotation(), with creation supported for Text, Link, FreeText, Square, Circle, Line, Polygon, PolyLine, Highlight, Underline, Squiggly, StrikeOut, Redact, Stamp, Caret, Ink and FileAttachment types, and where the README capability list documents reading and writing form widget values, metadata and outlines, page insert, delete, reorder, rotate and crop, and the Redact annotation plus page.applyRedactions() path that permanently removes marked content as our test confirmed; the scope covers annotations, widgets, metadata, outlines and page operations, does not claim general rewriting of existing body text, and leaves the permanent-removal verdict to the redaction field
Protect
Browse all protect toolsprotecting PDFs with MuPDF.js, where the README API overview lists PDFDocument operations for save and encrypt, and the capability list documents opening password-protected PDFs and checking and setting permissions, with save options covering encryption and permission settings; the scope records the documented password opening, permission checking and encryption save options and makes no reader-enforcement, algorithm or key-management guarantee beyond the documented API
Merge
Browse all merge toolsmerging and rearranging PDFs with MuPDF.js, where the README API overview documents PDFDocument operations for save, encrypt, merge, graft, journal and layers, and the capability list documents document merging by grafting pages from one PDF into another and page insert, delete, reorder, rotate and crop operations; the scope records the documented merge, graft and page operations and makes no claim about preserving signatures, forms, links or annotations across a merge
Compress
Browse all compress toolscompressing PDFs with MuPDF.js, where the README capability list documents save options for incremental updates, garbage collection and compression; the scope records the documented save-time compression and makes no lossless, fidelity or specific size-reduction guarantee because the result depends on the options and the document
View
Browse all view toolsrendering PDF pages with MuPDF.js, where the page documentation documents loading a page, getting its bounds, and converting it to a pixmap with page.toPixmap(matrix, colorSpace, alpha, annots), controlling resolution through the matrix, colour space, background transparency and whether annotations are rendered, and then exporting the pixmap as PNG, JPEG, PAM or drawing it to a canvas; the scope is rendering pages and images, not an interactive viewer, and makes no fidelity guarantee beyond the engine's documented high-fidelity rendering claim
Extract
Browse all extract toolsextracting text with MuPDF.js, where the page documentation documents page.toStructuredText() with asText() for plain text and asJSON(preserve-spans) for a structured object containing blocks, lines, spans, positional data and font data, and the README capability list documents text extraction, text search and link extraction from pages; the scope records the documented text, structure, search and link extraction, makes no OCR claim because the library has no OCR capability, and claims no image-extraction or accuracy guarantee beyond the documented APIs
Where your files are processed
No server involved
The MuPDF C engine compiled to WebAssembly and shipped inside the package, so parsing, rendering and editing happen in your own browser or Node process. That is a property of the library itself: what an application built with it does with your file depends on that application, not on this.
Inherent to the technology rather than a vendor claim: the MuPDF C engine is compiled to WebAssembly and shipped inside the package, so parsing, rendering and editing happen in your own browser or Node process. Caveat: the binary is large and the project notes the app must be served over HTTP rather than opened from the filesystem.
What it does
Artifex's official JavaScript and TypeScript binding to the MuPDF C engine, published on npm as `mupdf` and compiled to WebAssembly so the same code runs in browsers and in Node, Bun or Deno. It renders pages to PNG, JPEG, PAM or an HTML5 canvas, extracts plain or structured text with positions, searches text and reads links, creates and edits annotations including permanent redaction, merges and rearranges pages, reads and writes form field values, metadata and outlines, and can save with encryption, permission and compression options.
The current npm release is 1.28.1. There is no OCR and no signing API documented.
Best for
Teams that need high-fidelity rendering plus genuine editing - redaction, annotation, merging, encryption - in one client-side or server-side JavaScript stack, and that can either comply with the AGPL or buy a commercial licence.
Worth knowing
Licensing is the real decision: the engine is AGPL-3.0-or-later or a commercial licence from Artifex, and the vendor's distinction is that a commercial licence is required where AGPL compliance is not possible, which is a statement about the licence rather than legal advice for a particular product. The official npm package is `mupdf` at version 1.28.1, published on 6 September 2026; the older, similarly named community `mupdf-js` package with a hyphen is deprecated, so which package a project depends on matters.
The examples cover both browser processing and a Node REST server, so this is a browser and Node deployment rather than a no-server one, and running the engine locally says nothing about what the application hosting it uploads or stores. There is no vendor-hosted processing endpoint in the library itself.
The WebAssembly binary adds to a client bundle and its transfer and unpacked sizes have not been measured here, so no size figure is published. The documented capabilities do not include OCR or a signing API: text extraction reads text already in the file, and no certificate-signing surface was found.
Redaction is the exception among editing operations: a Redact annotation plus page.applyRedactions() permanently removes marked content, as our 17 September 2026 test confirmed on version 1.28.1, but that is the annotated redaction path rather than a claim that every editing operation alters content destructively. Save-time compression, encryption and permission settings are documented at README level and depend on the options supplied; no lossless, fidelity, reader-enforcement or algorithm guarantee is made.
Details, and where each comes from
Vendor statements, our own reading of their pages, and the things nobody has established yet, each answered separately. Where we have not confirmed something it says so rather than guessing, and a row nobody has established is greyed out.
- Versions covered
- Web · Self-hosted
- Website
- mupdfjs.readthedocs.io
- Requires an account
- Not applicable
- Watermark on the free tier
- Not verified
- Maximum file size
- Not verified
- Batch processing
- Yes
- Data residency
- Self-hosted
- Open source
- Yes
- Self-hostable
- Yes
- Licence
-
AGPL-3.0-or-later or commercial.
AGPL-3.0-or-later or commercial. The official npm package `mupdf` is published under AGPL-3.0-or-later, and the README badges the project as AGPL or Commercial.
Artifex's licensing page says most of its products are dual-licensed under the GNU AGPLv3 or commercial licence agreements, with commercial OEM and subscription options charged per copy with a quarterly minimum fee and no published figures; the page identifies Artifex Software Inc. as the company but does not publish a street address. No price is asserted.
The official package is `mupdf`; the older community package `mupdf-js` with a hyphen is deprecated.
- Redaction
- Removes the content
- Programmatic access
- Embeddable library · Browser JavaScript
- Last availability check
- Responded in 348 ms 21 October 2026
Checked automatically by our own runner, not reported by the vendor. 100% of our last 30 checks got a response.
What the redaction verdict rests on
Tested by us on 17 September 2026, on our own canary document rather than read off a product page.
What that does not establish
Tested on our own canary document. Deletes the marked text from the page structure and paints a fill; the saved file contains no image.
Verified on one document and one build.
What the vendor says
Claims are labelled rather than repeated as fact. Where we have checked something ourselves, it says so and shows when. Checked means we read the vendor's own page and it says what we recorded - not that we tested the behaviour, unless the note says we did.
-
“MuPDF.js is the official JavaScript and TypeScript library for reading, rendering, and manipulating PDF documents.”
Checked by us - the source says this Read 22 September 2026
Confirmed verbatim: the sentence is the README's opening line, and it continues with the detail that matters technically - "It wraps the MuPDF C engine in WebAssembly, so the same high-fidelity rendering runs in Node.js, browsers, Bun, and Deno - with no native dependencies." The word "official" is doing real work here: MuPDF.js is published by Artifex, the maker of MuPDF, which distinguishes it from a third-party wrapper, and it is the same vendor whose AGPL terms are recorded in the licensing tier.
So the licensing claim and this capability claim describe the same product from the same source, and a reader weighing the AGPL obligation should read them together.
Standing: Re-read and matched byte for byte
Check it yourself: the source, the SHA-256, and how we checked
- From
- the text a browser renders
- SHA-256
- eb594a116224d246ef6f9b9901f599ab04866dfddd4c24a9fab65371a518d64c
How we checked
Re-verified verbatim on 2026-09-22: https://github.com/ArtifexSoftware/mupdf.js re-rendered in headless Chrome with scripts/render-page.mjs and the claim's wording found in the rendered text. Originally verified on 2026-09-21. sourceHash is the SHA-256 of the re-rendered text, held as rv-github-com-ArtifexSoftware-mupdf-js-eb5fba1b.txt.
-
“AGPL v3: Free for open-source projects. If you distribute software using MuPDF.js or provide it as a network service, you must release your source code under AGPL.”
Checked by us - the source says this Read 21 September 2026
Confirmed verbatim: under a question reading "What license is MuPDF.js under?", the answer states "AGPL v3: Free for open-source projects. If you distribute software using MuPDF.js or provide it as a network service, you must release your source code under AGPL." The same answer gives the commercial alternative for "proprietary applications, SaaS products, or when you can't comply with AGPL" and adds a scope note the claim omits: "The licensing applies to both the JavaScript wrapper and the underlying MuPDF WASM binary." That matters because it means the AGPL obligation cannot be avoided by treating the WASM binary as a separate component.
This is the same Artifex licensing model recorded for MuPDF itself, Ghostscript and PyMuPDF in this batch.
Standing: Re-read and matched byte for byte
Check it yourself: the source, the SHA-256, and how we checked
- From
- the raw HTTP response
- SHA-256
- ed59297cff945d6f9b1885daaf6c081ddfeb1b832a45904d5b009100f38cc1b6
How we checked
The recorded source is the MuPDF.js FAQ; the URL implied by it (faq.html) returns 404, and the live page is https://mupdfjs.readthedocs.io/en/latest/faq/. Its rendered text is 1995 bytes and does not contain the licensing section at all, so the claim was read from the raw HTML response, 50234 bytes saved and hashed, where the answer sits in a collapsed FAQ block. sourceHash is the SHA-256 of that raw response.
-
“Genuine redaction: a Redact annotation plus page.applyRedactions() permanently removes the marked content, and the original cannot be recovered.”
Checked by us - the source says this Read 17 September 2026
The boxed string is gone from the saved file, and the lines 40pt above and below it survived, as did an entirely untouched second page. The output contains zero image XObjects, so nothing was rasterised: the marked text is deleted from the page structure and a solid fill is drawn where it was. qpdf reports no errors and agrees on every marker.
This is removal, not covering - the first of the three verdicts in the index to be confirmed by test rather than by vendor documentation, and the one where the vendor was telling the truth.
Standing: Re-read and matched byte for byte
Check it yourself: the source, the SHA-256, and how we checked
- From
- the text a browser renders
- SHA-256
- 8d6ce98159ba113288b2f3c15cde6ffd20f5359718eea9ffc5a81402f7fdf102
How we checked
The MuPDF engine driven directly through mupdf.js 1.28.1 on a two-page canary PDF. The redaction rectangle was derived from the engine's own text extraction rather than hard-coded, so the box provably covered the target.
The saved output was normalised with qpdf, the reference implementation, and searched for every marker; a control ran the identical search against the unredacted original, where all markers are present. Its source page was re-read on 2026-09-21 to record the source hash the original reading did not carry; the wording quoted in the claim is unchanged, so this does not re-date the verification, and sourceHash is of that re-read.
Each claim is quoted from the vendor's own pages. This section describes what we have and have not checked - it is not a judgement about anyone.
Sponsorship is distribution, not an endorsement or a promise of search rankings, AI citations, traffic, or sales. This listing is a free entry, compiled from published sources.
Related reading
- Which PDF tools really redact - which tools remove the content rather than cover it.
- Which PDF tools keep your file on your machine - what we count as processing on your own device.
- Open source PDF tools, and what their licences require - what open source does and does not tell you.