A fast, private, client-side PDF utility for splitting, merging, and compressing PDFs.
No uploads. No servers. Everything runs in your browser.
Upload a PDF and extract specific pages by entering ranges like 1-3, 5, 7-10, or split every page into its own file.
- Displays page count and file size after upload
- Validates page ranges in real time
- Single extraction downloads as
.pdf; individual-page split downloads as.zip
Combine multiple PDFs into one. Upload via file picker or drag-and-drop, then reorder by dragging.
- Drag-to-reorder with desktop drag-and-drop and mobile touch support
- Shows per-file page count and running total
- Add more files or remove individual entries at any time
Reduce file size by re-encoding embedded images at a selectable quality level. Text and vector graphics remain lossless.
| Quality | JPEG Level | Best for |
|---|---|---|
| High | 90% | Archival — minimal visible change |
| Medium | 75% | Sharing — balanced quality and size |
| Low | 50% | Email — smallest file |
- Optionally strip metadata (author, dates, keywords)
- Saves with PDF object-stream optimization for extra reduction
- Result card shows original size → compressed size → savings
| Component | Details |
|---|---|
| PDF manipulation | pdf-lib v1.17.1 — create, modify, and serialize PDFs entirely in JavaScript |
| ZIP packaging | JSZip v3.10.1 — bundle individual pages into a ZIP archive |
| File saving | FileSaver.js v2.0.5 — trigger downloads from in-memory blobs |
| Fonts | Inter (UI) + JetBrains Mono (page numbers, code) |
| Design system | Custom CSS with design tokens — fluid type scale, 4px spacing, OKLCH color palette, light/dark mode |
All libraries are loaded from CDN. No build step, no bundler, no dependencies to install.
# Clone the repo
git clone https://github.com/Okyumi/pdf-tool.git
cd pdf-tool
# Open in your browser — that's it
open index.html
# or
python3 -m http.server 8000 # then visit http://localhost:8000No npm install. No build process. Just static files.
pdf-tool/
├── index.html # Single-page app — all three tabs
├── base.css # Design tokens, reset, light/dark mode variables
├── style.css # Component styles, layout, responsive rules
├── app.js # All application logic (split, merge, compress)
└── README.md
Your files never leave your machine. All PDF parsing, image re-encoding, merging, and compression happen in the browser using JavaScript. There is no backend, no analytics, no tracking.
Works in all modern browsers that support:
FileReaderAPI<canvas>withtoBlob()- ES2017
async/await - CSS custom properties
Tested in Chrome, Firefox, Safari, and Edge.
MIT
