PDF to JPG

Nothing you choose here leaves your browser. There is no server to send it to — the file is opened and drawn on your own device, and nothing is uploaded, stored or seen by anyone.

Every page comes out as its own JPEG. That is two lossy steps stacked: the page is drawn to pixels, and then those pixels are compressed with a codec designed for photographs. Text and line art are the worst case for it — the sharp edges are exactly what JPEG smears — so if the page is mostly words, PDF to PNG will look better and often be smaller.

This page downloads one thing, and here it is before you choose a file. It loads Mozilla’s pdf.js — two files, pdf.min.mjs (448 KB) and pdf.worker.min.mjs (1,236 KB), which is 1.64 MB uncompressed and about 495 KB over the wire once your browser has decompressed them. They are served from this site rather than from a CDN, so no third party is told that you are reading a PDF, and they are fetched only when you choose a file — reading this page downloads nothing.

pdf.js is under the Apache License 2.0, and the copy of that licence is in the repository beside the files. Everything else on this site ships no library at all, and the privacy page says which pages are the exception.

…or drop files anywhere on this page.

What this conversion costs you

Every conversion loses something, and the honest version of that sentence names it. Here is what taking pictures out of a PDF keeps and what it does not.

What survives

What does not

How it works, and the one library on this site

Writing a PDF is a page of code. Reading one is not, and this page does not pretend otherwise: it uses pdf.js, Mozilla's PDF engine — the same one Firefox itself uses to display a PDF.

That is a library, and this site says so rather than hiding it. Every other converter here ships no codec at all. This one loads about 500 KB of JavaScript, served from this site rather than from anybody else's, so that your browser never announces to a third party that you are reading a PDF. It arrives once and your browser caches it.

Why not write it. A PDF that opens is not one file format, it is thirty years of them: object streams, cross-reference streams, eight compression filters, encryption, embedded fonts, substituted fonts, CID character collections, and an enormous quantity of files that do not quite follow the specification and are expected to work anyway. A partial implementation would not fail cleanly — it would open some of your files and quietly show the wrong thing for others, which is the worst outcome available. So this page uses the implementation that has spent fifteen years meeting those files.

Nothing is uploaded either way. The library runs on your device, on your file, and no part of the document is sent anywhere.

Where to go next

The same job in the other direction, and the rest of the PDF pages:

What this does not do

It reads what the file contains. It does not do OCR, so a scanned document — which is a picture of a page, not a page — has no text in it to find, and this page will say so rather than invent any.

It cannot open a PDF that is encrypted with a password you have not supplied, and it does not edit, merge, split, sign or fill in anything. Two font packs that pdf.js can optionally use are deliberately not shipped here: the replacements for the fourteen fonts a PDF may reference without embedding, and the character maps for Chinese, Japanese and Korean text in files using predefined collections. If text in one of those categories comes out wrong, that is why, and it is a trade against roughly three megabytes that almost no file needs.

And it does not upload anything, so it cannot work on a file that is not on the device you are using.