Drop your PDF files here
or click to browse · Up to 20 files at once

Reduce PDF size directly in your browser — no servers, no registration, no watermarks. Batch compress up to 20 files at once.
Drop your PDF files here
or click to browse · Up to 20 files at once
VeloTools PDF Compressor never transmits document bytes over the network. After you select files, the browser reads them via the File API into an ArrayBuffer; PDF.js renders each page to a canvas in tab memory; pdf-lib assembles a new PDF from JPEG page images. No fetch, presigned URL, or cloud queue participates in the pipeline.
This is structural privacy, not a policy promise. With Wi-Fi disabled after the page loads, compression still runs — proof that work is local. For NDAs, HIPAA-covered records, and financial statements, no third party can access file content because no upload step exists. Server-based compressors (iLovePDF, Smallpdf) must copy your file to remote storage; VeloTools cannot, by design.
_compressed.pdf files or use Download All (ZIP) — packaged locally with JSZip, never on a server.| Max files per batch | 20 PDFs |
|---|---|
| Max file size | No hard cap — limited by device RAM (guide: ~100 MB per file on desktop) |
| Supported PDF versions | PDF 1.4 – 2.0; scanned, vector, and mixed content |
| Compression method | Rasterize pages via PDF.js → JPEG encode → pdf-lib reassembly |
| Presets | Screen (72 DPI / 40%), Web (96 / 65%), Print (150 / 80%), Archive (200 / 90%) |
| Manual controls | DPI 72–300, JPEG quality 10–95%, grayscale, strip metadata, remove annotations |
| Typical savings | Scanned PDFs 70–90%; text-only exports 10–25% |
| RAM usage | ~DPI² per page during render (96 DPI A4 ≈ 6 MB bitmap per page) |
| Network | 0 bytes of PDF content leave the browser |
| Encrypted PDFs | Require password at open — use Unlock PDF first if needed |
Compression here is lossy rasterization, not in-place stream stripping. PDF.js draws each page onto a white canvas at scale = DPI / 72. The canvas is encoded as JPEG at your quality setting. pdf-lib embeds those JPEGs into a clean new PDF without legacy fonts, scripts, or redundant object streams.
Two independent levers. Lower DPI shrinks the canvas area (halving DPI cuts pixels by ~75%). Lower JPEG quality applies DCT compression on that bitmap. Presets combine both for sensible defaults: Screen maximizes size reduction for email; Archive keeps near-lossless output for legal archives.
Scanned vs vector text. A scanned page is already a photo — JPEG excels here (70–90% smaller). A Word-export PDF is mostly vector text and paths; rasterizing sharp edges produces JPEG-unfriendly high-contrast data, so savings are modest (10–25%). That is content physics, not a tool bug. Use grayscale on monochrome scans for an extra 15–25% reduction.
Smart compress path. For some image-heavy pages, the engine extracts embedded JPEG streams without full canvas render when safe — faster and preserves source quality on single-image pages. Complex layered PDFs fall back to full render.
Compress vs merge/split. Merge and Split use lossless copyPages. Compress intentionally trades fidelity for size. Merge first, compress second, is a common workflow for smaller email attachments.
Export to images. Need JPG/PNG per page instead of a smaller PDF? Use PDF to JPG — same PDF.js render path, image output instead of pdf-lib assembly.