How it works

Every tool on this site processes your PDFs entirely inside your browser, using open-source JavaScript libraries. This page gives a transparent, step-by-step breakdown of exactly what happens to your file for each operation — so you never have to take our word for it.

No network calls

Your file bytes never touch a network socket. The only requests this site makes are for its own HTML, CSS, and JS assets.

Open source libraries

pdf-lib and pdf.js are audited, widely-deployed open-source libraries — not proprietary black boxes.

Runs in your browser

Processing uses the same JavaScript engine that powers the rest of the page. Close the tab and everything is gone.

Merge PDF

Open tool

Library: pdf-lib

  1. 1Each selected file is read into an ArrayBuffer via the browser's FileReader API — entirely in memory, never on disk or network.
  2. 2pdf-lib's PDFDocument.load() parses each PDF's internal object tree.
  3. 3Pages are copied from each source document into a new empty PDFDocument using copyPages().
  4. 4The merged document is serialised to a Uint8Array via doc.save() and offered as a download using a temporary object URL.
pdf-lib is an open-source library with 13k+ GitHub stars and no network dependencies. You can audit the exact merge call in features/merge-pdf-tool.tsx.

Split PDF

Open tool

Library: pdf-lib + JSZip

  1. 1The PDF is loaded into memory and parsed by pdf-lib.
  2. 2For a page range or specific pages, only the selected zero-indexed pages are copied into a new PDFDocument.
  3. 3When splitting every page, each page becomes its own document. All outputs are then bundled into a ZIP in memory using JSZip and offered as a single download.
  4. 4Nothing is written to a server, temp directory, or any storage mechanism.
JSZip is a widely-used client-side library; the entire zip is assembled in RAM and discarded once downloaded.

Reorder Pages

Open tool

Library: pdf-lib

  1. 1pdf-lib reads the PDF and exposes its page list.
  2. 2You drag page cards to produce a new ordering (an array of original page indices).
  3. 3copyPages() copies all pages in the new order into a fresh document.
  4. 4The reordered document is saved and offered for download.
No page content is modified — only the ordering of the page references changes.

Delete Pages

Open tool

Library: pdf-lib

  1. 1The PDF is parsed and the full page index list retrieved.
  2. 2Your selected page numbers are parsed and validated against the actual page count.
  3. 3A new document is created containing only the pages not in the delete set.
  4. 4The result is serialised and downloaded.
Deleted pages are simply not included in the output document. The original file in your browser is untouched.

Rotate Pages

Open tool

Library: pdf-lib

  1. 1pdf-lib reads each page's current rotation angle from its page dictionary.
  2. 2The new rotation is set as (current + selected degrees) mod 360 using the PDF page's /Rotate key.
  3. 3If 'selected pages' mode is active, only those pages have their rotation updated.
  4. 4The modified document is saved and offered for download.
Rotation is stored as a single integer in each page's PDF dictionary — a very lightweight change that doesn't touch page content at all.

Fill PDF Form

Open tool

Library: pdf-lib

  1. 1pdf-lib reads the document's AcroForm dictionary, which contains references to all interactive fields.
  2. 2Field names, types (text, checkbox, dropdown, radio), and current values are extracted and displayed in the UI.
  3. 3When you submit, pdf-lib writes your typed values back into the corresponding field objects.
  4. 4If 'flatten' is checked, form.flatten() is also called before saving.
AcroForm data stays in your browser's memory. Field values you enter are never sent anywhere.

Flatten Forms

Open tool

Library: pdf-lib

  1. 1pdf-lib loads the form and calls form.flatten(), which renders each field's current visual appearance as a static content stream.
  2. 2The field widget annotations are removed from the page.
  3. 3The AcroForm dictionary is cleared from the document.
  4. 4The result is a standard PDF with no interactive elements.
Flattening is irreversible — fields cannot be recovered from the output. The original file is never modified.

Watermark PDF

Open tool

Library: pdf-lib

  1. 1For text watermarks, pdf-lib embeds Helvetica Bold and draws the text onto each page's content stream at the specified coordinates.
  2. 2For image watermarks, the image is embedded once via embedPng() or embedJpg(), then stamped onto each page.
  3. 3Position, opacity, rotation, and size are calculated relative to each page's dimensions so the watermark scales correctly.
  4. 4All pages are processed in sequence and the resulting document is saved.
Image bytes are read locally from your device and embedded in the PDF without any network transfer.

Page Numbers

Open tool

Library: pdf-lib

  1. 1pdf-lib embeds Helvetica to draw text on each page.
  2. 2For each page, the label text is computed by substituting {n} and {total} in your format string.
  3. 3The text width is measured using the font's metrics to align it correctly at the chosen position.
  4. 4The label is drawn at the correct margin, then the document is saved.
Page numbers are drawn as static text content — not as interactive annotations. The original content of each page is not affected.

Compress PDF

Open tool

Library: pdf-lib

  1. 1The document is loaded and re-serialised with useObjectStreams: true, which compresses the cross-reference table using DEFLATE.
  2. 2Unused objects and redundant entries are dropped during the save pass.
  3. 3The resulting byte count is compared to the original to show the savings.
Compression is structural — image pixels are not re-encoded, so quality is preserved exactly. Savings depend on how much redundant overhead the original document contained.

PDF to Images

Open tool

Library: pdf.js (Mozilla)

  1. 1pdf.js loads the PDF using its own parser (identical to what Firefox uses to display PDFs).
  2. 2For each page, a viewport is calculated at your chosen scale (1x to 3x).
  3. 3The page is rendered onto an off-screen HTML5 Canvas element.
  4. 4The canvas is exported to your chosen format (PNG, JPEG, WebP) using canvas.toDataURL().
  5. 5All pages are collected and either downloaded individually or zipped together with JSZip.
Canvas rendering runs entirely in the browser's GPU-accelerated compositing pipeline. No page pixels leave your device.

Images to PDF

Open tool

Library: pdf-lib

  1. 1Each image file is read into an ArrayBuffer via FileReader.
  2. 2PNG images are embedded with embedPng(); JPEGs with embedJpg().
  3. 3Other formats (WebP, BMP, GIF) are first drawn onto a canvas and re-exported as JPEG at 92% quality before embedding.
  4. 4A new PDF page sized to each image's native pixel dimensions is created, and the image is drawn to fill it.
  5. 5The completed document is serialised and downloaded.
Images are embedded inside the PDF's object stream. The resulting PDF is self-contained and has no external dependencies.

Create PDF

Open tool

Library: pdf-lib

  1. 1A new PDFDocument is created from scratch with no pages.
  2. 2Helvetica and Helvetica-Bold are embedded from pdf-lib's built-in standard font set.
  3. 3Text, lines, and layout elements are drawn using pdf-lib's coordinate-based drawing API.
  4. 4The document is serialised and downloaded.
The generated PDF contains only the content you entered. No metadata, tracking IDs, or template identifiers are included.

View PDF

Open tool

Library: pdf.js (Mozilla)

  1. 1pdf.js parses the PDF's page tree and renders each page on demand.
  2. 2At your chosen zoom level, a viewport is computed and the page is rendered onto a canvas.
  3. 3Navigation updates only re-render the requested page — not the whole document.
This is the same rendering engine used by Firefox's built-in PDF viewer. Everything runs offline in your tab.

Extract Text

Open tool

Library: pdf.js (Mozilla)

  1. 1pdf.js loads the PDF and accesses its text content layer.
  2. 2For each page, getTextContent() returns an array of text items, each with a string and position.
  3. 3The strings are joined with spaces and collected per-page into the text area.
  4. 4You can copy the text or download it as a .txt file — both operations happen entirely in the browser.
Only selectable (digital) text can be extracted. Scanned images of text require OCR, which is not available in this client-side toolkit.