Images to PDF
Upload multiple images, reorder them by drag-and-drop, and download as a single PDF. All processing happens entirely in your browser — your images never leave your device.
All processing happens in your browser. Your images are never uploaded to any server.
Drop images here
or click to browse (JPG, PNG, WebP, GIF)
How to use Images to PDF
- 1
Drag and drop image files onto the drop zone, or click to browse and select files.
- 2
Thumbnails appear for each image. Drag them to rearrange the page order — the number badge shows the page number.
- 3
Click 'Add images' to add more files at any time.
- 4
Click 'Generate & Download PDF' to create and download the PDF entirely in your browser.
Features
- ✓100% browser-based: PDF generation uses the jsPDF library client-side. Your images never leave your device.
- ✓Drag-to-reorder: Intuitively rearrange pages by dragging thumbnails. Number badges show the page sequence.
- ✓Supports JPG, PNG, WebP, and GIF. Images are routed through a Canvas element to normalize them to JPEG before embedding.
- ✓A4 format (210×297mm): Images are centered on each page with aspect ratio preserved and a 10mm margin on all sides.
FAQ
Q. Are my images uploaded to a server?
A. No. PDF generation runs entirely in your browser using jsPDF. No image data is ever transmitted to or stored on any server.
Q. Is there a limit on the number of images?
A. There is no hard limit, though processing many large files will use more browser memory. Up to around 50 images generally works smoothly.
Q. Can I change the PDF page size?
A. Currently, output is fixed to A4 (210×297mm). Images are automatically resized to fit the page while preserving their aspect ratio.
Q. What image quality is used in the output PDF?
A. Images are routed through the Canvas API and embedded at JPEG quality 0.92 (on a scale of 0–1). This balances file size and visual quality well. For maximum fidelity, use high-resolution source images and avoid upscaling them beforehand.
Q. Do portrait photos from my phone fit on A4 pages?
A. Yes. Each image is automatically fitted inside the A4 page (with 10mm margins) while preserving its original aspect ratio. Portrait images scale to fit the page width; landscape images scale to the page height. No forced stretching or cropping occurs.
Technical Deep Dive: Client-Side PDF Generation Pipeline
PDF generation runs entirely in the browser using the jsPDF library. The pipeline works as follows: first, FileReader.readAsDataURL() reads each image file as a Base64-encoded data URL. Next, an HTMLImageElement is created and the image is decoded into pixel data via Canvas's drawImage() call. The canvas is then serialized to a JPEG data URL at quality 0.92 via canvas.toDataURL('image/jpeg', 0.92). Finally, jsPDF's addImage() method embeds the compressed image data into a PDF page.
Fitting each image onto an A4 page (210×297mm) while preserving aspect ratio requires computing the available print area (190×277mm after 10mm margins on all sides). The aspect ratio r = width/height is calculated for each image. If r > 190/277 (landscape orientation), the image is scaled so its width equals 190mm and height is calculated proportionally. Otherwise (portrait), height is set to 277mm and width scaled accordingly. This guarantees no cropping or distortion.
WebP, GIF, and other formats that cannot be directly embedded into PDF are normalized to JPEG through the Canvas element. The Canvas API uses the browser's native image decoders, so any format supported by the browser — JPEG, PNG, WebP, GIF, AVIF — is handled transparently. For animated GIFs, only the first frame is used.
The finished PDF is constructed as an in-memory Blob object. URL.createObjectURL(blob) produces a temporary object URL, which is set as the href of a dynamically created <a> element with a download attribute to trigger the browser's native download. After the download starts, URL.revokeObjectURL() releases the object URL to prevent memory leaks.
Security & Privacy Guarantee
Every image you add is read into browser memory by the FileReader API as an ArrayBuffer or Blob — it never leaves your device. The entire PDF generation pipeline runs inside jsPDF's JavaScript code without any network requests. Medical images, scanned legal documents, personal photos, and confidential paperwork can all be processed with complete privacy.
You can confirm zero data transmission by opening your browser's DevTools Network tab before processing images. No upload requests or API calls will appear, because the tool is architecturally incapable of sending your files anywhere.
Image data is managed by the browser's garbage collector and is fully released when you close or reload the tab. This service never records the content, filenames, or number of images you process.