A privacy-first, client-side PDF toolkit that runs entirely in your browser. Your files never leave your device — all processing happens locally using Web Workers.
Live demo: https://fullo.github.io/pdf-worker/
36 tools, all running 100% client-side:
| Tool | Description |
|---|---|
| Merge PDF | Combine multiple PDFs into a single file |
| Split PDF | Extract pages or split into individual documents |
| Compress PDF | Reduce file size while maintaining quality |
| Rotate PDF | Rotate pages by 90, 180, or 270 degrees |
| Watermark | Add text or image watermarks with opacity and positioning |
| Page Numbers | Add page numbers with customizable format and position |
| Header & Footer | Add headers/footers with {page} and {total} placeholders |
| PDF to JPG / PNG / WebP | Convert PDF pages to images |
| JPG to PDF | Convert images to PDF with orientation and margin options |
| Text to PDF | Convert plain text into a formatted PDF document |
| Markdown to PDF | Convert Markdown text to styled PDF documents |
| PDF to Text | Extract text content from PDF documents |
| PDF to EPUB | Convert PDF documents into EPUB ebooks |
| OCR PDF | Make scanned PDFs searchable with optical character recognition |
| Compare PDF | Compare two PDFs side by side and highlight differences |
| Protect PDF | Add password protection and permission restrictions |
| Unlock PDF | Remove password protection from PDFs |
| Crop PDF | Interactive visual crop with draggable borders |
| Resize PDF | Change page size (A4, A3, Letter, Legal) |
| N-Up PDF | Combine multiple pages onto a single sheet (2, 4, or 9 per page) |
| Redact PDF | Draw redaction areas over sensitive content |
| Edit PDF | Add text, rectangles, lines, and freehand drawings |
| Sign PDF | Draw or upload signatures and place them on pages |
| Flatten PDF | Merge form fields and annotations into page content |
| Grayscale PDF | Convert all pages to black and white |
| Invert Colors | Invert all colors in a PDF for a negative effect |
| Organize PDF | Reorder, duplicate, or remove pages via drag-and-drop |
| Reverse Pages | Reverse the order of all pages |
| Add Blank Page | Insert a blank page at the beginning or end |
| Remove Blank Pages | Automatically detect and remove blank pages |
| Extract Images | Extract embedded images from PDFs |
| Edit Metadata | View and edit PDF metadata (title, author, keywords, etc.) |
| Repair PDF | Attempt to repair corrupted or damaged PDF files |
| PDF Booklet | Rearrange pages for double-sided booklet printing |
All output PDFs are automatically stamped with creator: pdfworker.eu and relevant keywords.
- Vue 3 + TypeScript + Composition API
- Vue Router (hash mode for static hosting)
- Tailwind CSS 4 (Vite plugin)
- pdf-lib — PDF creation and manipulation
- pdfjs-dist — PDF rendering and page preview
- tesseract.js — OCR engine for scanned documents
- Vite 7 — Build tool with code splitting
- VitePWA — Progressive Web App with offline support
- Web Workers — All PDF processing runs in a dedicated worker thread to keep the UI responsive
- Code splitting — Each tool component, blog language, and heavy library is lazy-loaded on demand
- Batch processing — Most tools support processing multiple files at once, with ZIP download
- Client-side only — Zero server processing, zero file uploads, zero backend infrastructure
- SEO — Dynamic meta tags, canonical URLs, JSON-LD structured data, and sitemap
- Blog — Multilingual blog with lazy-loaded articles per language and infinite scroll
Supports 15 languages: English, Italian, German, French, Portuguese, Spanish, Dutch, Swedish, Finnish, Danish, Norwegian, Belgian French, Greek, Slovenian, and Czech.
Language preference is detected automatically and saved in localStorage.
git clone --recurse-submodules https://github.com/fullo/pdf-worker.git
cd pdf-worker
npm install
npm run devThe
--recurse-submodulesflag fetches the SCI profiler submodule atlib/sci-profiler. If you already cloned without it, rungit submodule update --init.
npm run buildOutput goes to docs/ for GitHub Pages deployment.
npm run test # run all tests once
npm run test:watch # watch mode (re-runs on file changes)
npm run test:coverage # coverage reportTests use Vitest and cover all 36 PDF services (187 tests). Each service has a co-located .test.ts file under resources/js/Services/. Canvas-dependent services (pdfjs-dist rendering) are tested via mocked canvas helpers.
Automated Lighthouse CI audit for accessibility, performance, and best practices:
npm run audit:a11yAudits four representative pages (home, tool, SCI report, WSG report) against these thresholds:
| Category | Threshold | Level |
|---|---|---|
| Accessibility | 90% | Error |
| Performance | 80% | Warning |
| Best Practices | 90% | Warning |
Configuration lives in lighthouserc.json. Reports are saved to .lighthouseci/.
PDF Worker actively tracks its environmental impact through two complementary approaches.
The SCI (Software Carbon Intensity) report measures the carbon footprint of each PDF tool. It uses the SCI profiler (included as a git submodule) to benchmark energy consumption, embodied carbon, and CO2 emissions per tool invocation.
To update the benchmark data:
-
Start the dev server:
npm run dev
-
Open the browser console (the SCI profiler loads automatically in dev mode).
-
Run all benchmarks:
await __sciProfiler.runAll()
-
Export the JSON report and copy the output:
await __sciProfiler.exportReport('COMMIT_HASH')
Copy the JSON output and save it to
sci-report/latest-results.json. -
Export the markdown report and copy the output:
await __sciProfiler.exportMarkdown('COMMIT_HASH')
Copy the markdown output and save it to
sci-report/latest-report.md. -
Rebuild:
npm run build
The profiler is tree-shaken from production builds — it only runs in dev mode.
The SCI profiler ships with default constants for a 14-inch MacBook Pro M1 Pro. If you're running on a different machine, configure your own parameters before running benchmarks:
__sciProfiler.configure({
devicePowerW: 25, // Your device's software-attributable power (Watts)
carbonIntensity: 450, // Grid carbon intensity (gCO2eq/kWh) for your region
embodiedTotalG: 300_000, // Embodied carbon (g CO2e) from your device's LCA
lifetimeHours: 14_600, // Expected lifetime (hours): e.g. 5 years x 365d x 8h
lcaSource: 'Dell XPS 15 Product Carbon Footprint 2024',
machine: 'Dell XPS 15 9530, i7-13700H, 32GB, Ubuntu 24.04',
})| Parameter | Default | Description |
|---|---|---|
devicePowerW |
18 | Software-attributable device power (Watts) |
carbonIntensity |
332 | Grid carbon intensity (gCO2eq/kWh) |
embodiedTotalG |
211,000 | Embodied carbon excluding use-phase (grams CO2e) |
lifetimeHours |
11,680 | Device lifetime (hours) |
lcaSource |
Apple 14-inch MacBook Pro PER Oct 2021 | LCA data source description |
machine |
14-inch MacBook Pro M1 Pro, 16GB, macOS 15.3 | Machine description for reports |
The WSG report maps how PDF Worker aligns with the W3C Web Sustainability Guidelines (WSG) 1.0 — 80 guidelines across four categories: User Experience Design, Web Development, Hosting & Infrastructure, and Business Strategy.
Current coverage: 51 / 80 guidelines (50 fully addressed, 1 partial). The remaining guidelines target server-side infrastructure or organizational processes outside the project's scope.
Compliance data lives in wsg-report/wsg-compliance.json (single source of truth imported by the Vue page) and wsg-report/WSG.md (human-readable, git-diffable report).
- No file uploads — all processing is client-side
- No tracking or analytics
- No cookies (only localStorage for language preference)
- Google AdSense for ads (optional cookies)