🔗 Live: pdf-editor-9gh.pages.dev
A free, client-side PDF editor that runs entirely in your browser. No backend, no account, no sign-up, no upload — your files never leave your machine. Anyone can use it, for free, forever.
Load a PDF, annotate it with text and images (Latin + Thai fonts supported), reorder/delete/duplicate/rotate pages or insert pages from another PDF, then export back to a real PDF with vector text and full-resolution images.
- Annotate — add text and images anywhere on a page
- Page operations — delete, move, duplicate, rotate, or insert pages from another PDF
- Fonts — Latin fonts plus Thai (Sarabun) fallback for Thai text
- Export — writes a standard PDF with vector text and native-resolution images (not a flattened screenshot)
- Re-openable export — optionally embed your edit history in the exported PDF so you can reopen it here later and keep editing
- 100% client-side — nothing is uploaded anywhere; it works offline once loaded
Just open pdf-editor-9gh.pages.dev — no install, no account, no build.
Prefer to run it yourself? Clone the repo and open pdf-editor.html directly in a browser, or serve it locally:
python3 -m http.server 8000Then open http://localhost:8000/pdf-editor.html.
This is a no-build-step project: three plain files, loaded directly by the browser.
pdf-editor.html— the app: UI, canvas, exportpage-ops.js— pure logic for page operations (delete/move/duplicate/rotate/insert)geom.js— pure logic for annotation placement/coordinate math
There's no build tool or test runner. Two self-checking HTML pages serve as the test suite:
python3 -m http.server 8000
# open http://localhost:8000/page-ops.test.html
# open http://localhost:8000/geom.test.htmlRun page-ops.test.html after changing page-ops.js or any page operation, and geom.test.html after changing geom.js or the export drawing path.
See CLAUDE.md for a full architecture walkthrough.
Built on PDF.js, Fabric.js, and pdf-lib (+ fontkit), all loaded from CDN.
MIT — see LICENSE.