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

Reduce PDF file size in your browser, compare the actual result, and download it without sending the document to VeloTools.
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 | 120 MB per file; available browser memory may constrain complex documents sooner |
| 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 |
| Size result | Depends on page content and the selected DPI, JPEG quality, grayscale, and cleanup options |
| 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 reduces the rendered pixel count. Lower JPEG quality applies a stronger lossy encode to that page image. Presets combine both; inspect the downloaded result because smaller files can lose visible detail.
Scanned vs vector text. Image-heavy scans often have more reducible data than PDFs built mainly from vector text. The page reports the actual before-and-after byte counts instead of promising a fixed saving.
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.
These pages start with platform-aware presets (size checkers, Screen/Web bias, grayscale when homework scans dominate). Same local compressor — different defaults so the first download is closer to what Gmail, Canvas, or WhatsApp actually accept.
Scanned contracts and course packs blew past email limits. Upload compressors were a non-starter for client PDFs. This page re-encodes with PDF.js / pdf-lib in memory — Screen/Web/Print/Archive presets match the job, not a marketing slider. Grayscale when text is the only signal; keep color for design proofs.