99tools

Images to PDF

runs in your browser

Turn JPEG, PNG, WebP, GIF, BMP or AVIF images into one PDF in your browser: page size, margins, orientation, rotation and page order. No upload.

Drop files here, or .

JPEG, PNG, WebP, GIF, BMP or AVIF, in any order — you can rearrange them below. Built in your browser; nothing is uploaded.

Add images to make a PDF.

about this tool

One page per image

Drop JPEG, PNG, WebP, GIF, BMP or AVIF files and each becomes a page, in the order shown. Drag a tile or use its arrows to reorder, rotate it a quarter turn at a time, or remove it. Every tile shows its pixel size and the page it will make, together with the dpi the image is actually printed at, so a photo that is being blown up is obvious before you save.

Page is A4, Letter, Legal, A3, A5 or "fit the image", which makes each page exactly the size of its image plus the margin. Turn forces portrait or landscape, or follows each image on auto. Margin is the same on all four sides. Size decides how the image fills the page: fit page scales it up or down, shrink only never enlarges it beyond its own size at the chosen dpi, and actual size places it at its pixel size even if that runs off the page, which the panel warns about.

Points, pixels and dpi

PDF measures pages in points, 72 to the inch, so A4 is 595 × 842 points. An image has pixels, not inches, so the dpi setting bridges the two: at 150 dpi a 1500-pixel-wide photo is 10 inches, or 720 points, across. The layout maths is pure and tested — centring, margins, rotation and the printed dpi — and a warning appears when an image would cover the page at less than about 110 dpi, which looks soft in print.

What goes into the file

PDF can carry JPEG and PNG data directly, so by default those files are embedded byte for byte: nothing is re-compressed and nothing is lost. WebP, GIF, BMP and AVIF cannot be embedded, so they are drawn on a canvas and re-encoded as PNG. Choosing JPEG instead re-encodes everything at the quality you pick, which is far smaller for photographs and flattens transparency onto white. Choosing PNG re-encodes everything losslessly. Rotation is stored as a transform, so no pixels are resampled. A title can be set, and the producer is this site.

Limits

HEIC and SVG are refused with a pointer to the tools that convert them, rather than pulling a large decoder into this page. Animated GIFs and WebP contribute their first frame. Images are placed centred; there is no multiple-images-per-page grid, no caption and no page numbering — the Watermark and Page Numbers tool adds those to a finished PDF. Everything runs in your browser, so a hundred large photographs will use a lot of memory. Nothing is stored between visits.

Going the other way, PDF to images renders pages back out as PNG or JPEG, and merge PDF will join the result to a document you already have.

questions

What does the dpi setting change?
It says how many image pixels make an inch of page. A 3000-pixel-wide photo is 10 inches across at 300 dpi and 20 inches at 150. On a fixed page size it only matters for “shrink only” and “actual size”; with “fit the image” it sets the page itself.
Fit page, shrink only or actual size?
“Fit page” scales each image up or down to fill the space inside the margins. “Shrink only” does the same but never enlarges an image past its own size at the chosen dpi, so small images stay sharp and sit in the middle. “Actual size” places it at exactly its pixel size, which can run past the page edge; the panel warns when it will.
Are my images re-compressed?
Not by default. PDF can hold JPEG and PNG directly, so those files go in byte for byte and lose nothing. WebP, GIF, BMP and AVIF have to be re-encoded, and become PNG unless you pick JPEG. Choosing JPEG re-encodes everything and makes the file much smaller, at some quality cost.
Is anything uploaded?
No. The images are decoded in your browser and pdf-lib writes the PDF there too. Nothing leaves the page and nothing is stored between visits.
What about HEIC photos from an iPhone?
HEIC is not accepted here, because decoding it needs a megabyte of extra code. Run the file through the Image Converter first and drop the JPEG or PNG it gives you.