Extract Images From PDF exports image objects that are already stored inside a PDF, and for one common case it can hand back the document's original JPG bytes rather than a re-rendered snapshot. The DCTDecode filter is the PDF name for an embedded JPEG stream, and the tool treats that case specifically by keeping the bytes untouched and naming the download .jpg. A second supported case, an unmasked 8-bit FlateDecode image in DeviceRGB or DeviceGray color, does not arrive as a standalone image file, so the tool inflates that raw pixel stream using a browser-native DecompressionStream, paints it onto a local canvas, and writes the result as a PNG. Everything else, including JPX, JBIG2, LZW, indexed palettes, CMYK, soft masks, image masks, predictors, and chained filters, is recognized but skipped, because forcing it through the JPG path would return a damaged file. That means a single PDF can return a mix of JPG and PNG downloads depending on how each original image was embedded.

Extracting Versus Rasterizing: Two Different Tasks
Many readers searching for a way to extract images from PDF to JPG are actually trying to grab an individual photograph, logo, or scan that was placed into the document at authoring time, not a screenshot of the surrounding page. The distinction matters for image quality. A page rasterizer renders a PDF page to JPG or PNG as a single picture of everything visible, including text, vector artwork, and any embedded images re-encoded into one large bitmap. An extractor like Extract Images from PDF works at the object level: it walks the indirect object table with pdf-lib, finds image XObjects via PDFRawStream, and hands each one back with its stored bytes intact where possible.
For DCTDecode (JPEG) streams the stored bytes are kept. For FlateDecode RGB or grayscale streams the bounded raw pixels are decoded and re-encoded to PNG in the browser. For everything else the tool notes a skip and moves on. If the goal is the asset that the author placed into the PDF, the extract path gives you the original data rather than a recompressed page snapshot.
If the goal is the whole visible page including rendered text and vector shapes, use PDF to JPG Converter or PDF To PNG instead. Those are page rasterizers with adjustable scale. Choosing the wrong category is the most common reason a download looks wrong: a reader expecting the embedded JPG asset but receiving a full-page snapshot, or vice versa.
When the Download Is a JPG and When It Is a PNG
Two PDF storage cases are supported by the extraction code path. The first is DCTDecode, which is the PDF specification's way of saying an embedded JPEG stream. The stored JPEG bytes go straight to the download, untouched. Re-rendering would only add a generation of quality loss, and the tool avoids that step on purpose.
The second supported case is a simple FlateDecode image using 8-bit DeviceRGB or DeviceGray color, with no DecodeParms, no masks, and no chained filters. The raw pixel data is inflated into a local pixel buffer, dropped onto a canvas, and exported as PNG. PNG is used there because the raw Flate stream by itself is not a complete file that any normal app can open; it is just compressed pixel data without a container.
The table below summarizes what you can expect for each case, and what happens when an asset falls outside the supported set.
| Storage case in the PDF | What the tool does | Output file | Original bytes preserved |
|---|---|---|---|
| DCTDecode (embedded JPEG) | Locates the stream and exports the bytes as-is | .jpg | Yes, byte-for-byte |
| FlateDecode, 8-bit DeviceRGB or DeviceGray, no DecodeParms, no masks | Inflates pixels, paints on local canvas, encodes PNG | .png | Pixel data preserved; container rewritten |
| JPX, JBIG2, LZW, indexed palette, CMYK, image mask, soft mask, predictor, chained filters | Skipped and reported | None | Not applicable |
A repeated indirect image reference is inspected only once, so one stored asset that is reused across several pages produces a single download rather than a confusing set of duplicates. That keeps the output list focused on actual assets rather than renderings.
How to Extract Images From a PDF to JPG Locally
The exact steps match what the tool reports, and they keep the document on your machine the whole time. Open the Extract Images from PDF tool in the browser tab where you want the downloads to land, then follow these steps.
- Pick one local PDF up to 25 MB. Larger files are rejected before any scanning starts. Pick a single file per session; multi-file batches are not part of this workflow.
- Click "Extract images." The browser begins scanning bounded embedded image objects in the PDF. The document header is validated and image XObjects are enumerated. Nothing leaves your device during this step.
- Review the list. Each supported image appears with its detected format, JPG or PNG, and its dimensions in pixels. Skip entries indicate objects the tool deliberately did not decode and explain why.
- Download each supported image. Each row has its own download link. Save the JPGs where you can verify them against the source page. Temporary download URLs are released when another file is selected or when you leave the tool.
Once you have a download, open it in a normal image viewer and compare it against the corresponding area of the original PDF page. The dimensions, color depth, and aspect ratio should match what you saw in the source. If they do not, the tool may have skipped the asset, or the original image was stored in an encoding the browser tool does not attempt.
The Safety Limits Applied Before a Download Is Created
A handful of budgets run before the tool allocates a large output buffer, because unbounded Flate streams or oversized images can stall the browser tab. The verified limits, taken from the product contract, are listed below.
- PDF size: up to 25 MB for the input file.
- Image dimensions: a maximum edge of 12,000 pixels per image.
- Per-image pixel count: 40 megapixels.
- Total pixel count: 100 megapixels across all extracted images in one session.
- Decoded Flate budget: 100 MB of inflated pixel data summed across FlateDecode images.
- Candidate count: a bounded candidate list during enumeration, also enforced before output buffers are created.
A password-protected, malformed, or unusually complex PDF can still fail despite these budgets. The tool does not bypass encryption, repair a broken file, or validate a signature. It also does not make claims about whether the source document is trustworthy. That judgement belongs to the user, not to the tool.
Why Some Images Are Skipped Instead of Decoded
PDF image storage has many legitimate variations, and the extract path does not pretend those variations are interchangeable with a simple DCTDecode or FlateDecode RGB stream. Some images use JPX or JBIG2 for high compression. Others use LZW or indexed palettes to reduce bandwidth. CMYK images are common in print-oriented workflows. Predictors are paired with Flate, soft masks and image masks handle transparency and cutouts, and several filters can be chained in sequence.
Decoding those cases through the wrong code path would silently change colors, drop transparency, or return a file that opens but has the wrong pixel values. Skipping is the safer choice. A skip entry tells you the asset exists in the PDF and that the tool chose not to produce a file from it, instead of returning something visually plausible but technically wrong. For these unsupported cases the honest fallback is a page rasterizer such as PDF To PNG, which can still capture the visible content of the page, at the cost of treating the asset as part of the page rather than as an independent file.
Keep the original PDF after extraction. Open the downloaded JPGs and PNGs, confirm the dimensions and content match what you expected from the source page, and use the downloads only after that check passes. The tool is honest about what it can and cannot decode, and that honesty is the reason the JPGs it does produce can be treated as the document's stored image payload rather than a synthesized approximation.
If you're weighing options, Extract Pages From Multiple PDF Files at Once covers this in detail.