A full set of PDF tools that run entirely in your browser — nothing is uploaded to a server. Merge, split, organize, rotate, crop, resize, convert, extract and clean, all client-side.
| # | Name | Pages | Range | Pace | Reverse | |
|---|---|---|---|---|---|---|
| {{ idx + 1 }} | {{ f.name }} Loading… Password required Unlocking… Unlocked {{ f.error }} | {{ f.pageCount ?? '…' }} |
Passwords are used only in this browser tab and cleared after each unlock attempt. The merged PDF will not be password-protected.
{{ mergeValidationError }}
{{ result.error }}
Loading PDF…
Approximate — final size depends on how each output file re-serializes, not a hard guarantee.
{{ splitValidationError }}
{{ splitResult.error }}
Loading PDF…
Click the gap after a page to toggle a split point. {{ clickPicker.dividerGroups().length }} file(s) will be produced.
{{ clickResult.error }}
Loading PDF…
Click a page to select it (shift/ctrl to extend), drag tiles to reorder. Inserted pages land after the last selected tile.
Click pages to select them (shift/ctrl to extend), then Run.
{{ orgResult.error }}
Loading PDF…
Click a thumbnail to select it for "Selected" scope (shift/ctrl to extend).
Orange area is what stays after cropping — preview shown on page {{ cropPreviewIndex + 1 }}.
{{ cropValidationError }}
{{ rcResult.error }}
{{ rnFile.name }} — {{ rnFile.pageCount }} pages
Loading PDF…
{{ nupGrid.rows }}×{{ nupGrid.cols }} = {{ nupGrid.rows * nupGrid.cols }} source pages per output sheet (A4), centered in each cell.
{{ rnValidationError }}
{{ rnResult.error }}
Drag tiles to reorder — output page order follows this order.
{{ ipPdfFile.name }} — {{ ipPdfFile.pageCount }} pages
Loading PDF…
{{ ipResult.error }}
{{ etFile.name }} — {{ etFile.pageCount }} pages
Loading PDF…
This pulls the embedded text layer only — a scanned/image-only PDF will correctly produce an empty result, not an error. Turn on OCR below to read scans.
Keeps the text layer untouched and reads only the rasters embedded in each page — screenshots, charts, captions baked into artwork. Decorative images below 200×200 are skipped, and a logo repeated across pages is recognised once.
⚠ This PDF already has a text layer. Every page throws it away and keeps OCR's guess instead — expect lost headings, merged columns and misread words, plus stray text picked out of screenshots. Use it only when the existing text layer is itself broken.
OCR runs in your browser — the engine (~3 MB) and each language model (0.5–2 MB) download once on first use, then stay cached. Recognition takes a few seconds per page and its output is a best guess: pages read by OCR are labelled in the result.
{{ etProgress }}
{{ etResult.error }}
🔍 Page{{ etResult.ocrPages.length > 1 ? 's' : '' }} {{ etResult.ocrPages.join(', ') }} read by OCR — recognised text, not the document's own text layer.
🔍 {{ etResult.ocrImageCount }} image{{ etResult.ocrImageCount > 1 ? 's' : '' }} read by OCR on page{{ etResult.ocrImagePages.length > 1 ? 's' : '' }} {{ etResult.ocrImagePages.join(', ') }} — marked [Image n — OCR] in the output, below each page's own text.
⚠ No text found on page{{ etResult.emptyPages.length > 1 ? 's' : '' }} {{ etResult.emptyPages.join(', ') }}{{ etOcrEnabled ? ' — OCR could not read them either.' : ' (likely scanned) — expected for image-only pages, not an error. Turn on OCR to read them.' }}
{{ eiFile.name }} — {{ eiFile.pageCount }} pages
Loading PDF…
Finds standard embedded images on every page. Inline images and non-raster content aren't extracted in this version.
{{ eiResult.error }}
No embedded images found in this PDF.
{{ mfFile.name }} — {{ mfFile.pageCount }} pages
Loading PDF…
This PDF has {{ mfFile.formFieldCount }} form field(s).
Nothing to flatten — this PDF has no fillable form fields.
Does not touch embedded JavaScript or file attachments.
{{ mfResult.error }}
{{ rpFile.name }}
Checking PDF encryption…
The password is only used in your browser to unlock the file — it is never sent anywhere. The downloaded copy opens with no password at all.
{{ rpResult.error }}
{{ ppFile.name }} — {{ ppFile.pageCount }} pages
Loading PDF…
Passwords do not match.
The password is only used in your browser to lock the file — it is never sent anywhere. There is no way to recover a lost password, so keep it somewhere safe.
{{ ppResult.error }}
Every operation here runs with pdf-lib and pdf.js loaded straight into your browser tab — files never leave your machine, there is no upload step and no server-side processing.
Privacy: 100% client-side. Nothing you load into this tool is sent anywhere.