Combine, reorder, rotate, and annotate PDFs entirely in your browser. Nothing is uploaded — every file is processed client-side and never leaves your device.
Live: https://anivia.ch/pdf
- Merge — add several PDFs and combine them into one
- Reorder — drag pages into any order
- Rotate — a page, all pages, left/right; reverse page order
- Duplicate / delete pages, insert blank pages
- Annotate — draw and add text with adjustable colour, font size, stroke width
- Undo, multi-select, select all
- Light/dark theme, keyboard shortcuts
Scan pulls pages straight from a network scanner (AirScan/eSCL – most HP, Canon, Epson and Brother devices since ~2015). Browsers cannot reach devices in your network, so a small helper does it on your computer:
- Windows:
scan.ps1, started with one line in Win+R (shown in the Scan dialog;-ExecutionPolicy Bypass, so it also runs where the policy is AllSigned and "Run with PowerShell" refuses unsigned scripts). No install. Network scanners Windows connected via AirScan are scanned directly over eSCL (flatbed and feeder); other scanners Windows knows (vendor driver, USB) go through WIA, flatbed only – WIA's script interface returns just the first sheet from a feeder. - macOS / Linux (or Windows with Python):
python3 scan.py # finds scanners via mDNS
python3 scan.py --scanner 192.168.1.50 # or name one directly
Besides network scanners it also offers every scanner the system already
knows: on Windows everything set up in Windows (WIA, via PowerShell –
e.g. USB scanners), on Linux everything SANE knows (scanimage, package
sane-utils). Network devices that both would list again are left out.
For feeders that only read one side there is manual duplex: scan the fronts, put the stack back with the back sides up (last sheet on top), scan the backs – the pages are interleaved automatically (the backs come out in reverse) and blank backs can be left out.
It listens on 127.0.0.1:7710, answers only to this site, and hands the pages
to the browser as JPEGs. Standard library only.
No server, no upload, no tracking. A strict Content-Security-Policy
(default-src 'none') blocks all external requests — the page can only talk to
itself. Your PDFs are opened, edited, and saved locally in the browser.
Static HTML/CSS/JS, no build step. Rendering via pdf.js,
writing via pdf-lib — both vendored in vendor/.
Serve the folder under the path /pdf/ (assets use absolute /pdf/... paths):
python3 -m http.server 8000 # then open http://localhost:8000/pdf/
Or drop it in a webroot at /pdf. .htaccess sets the CSP and cache headers for Apache.