[{"data":1,"prerenderedAt":393},["ShallowReactive",2],{"blog-palette":3,"\u002Fblog\u002Fextract-images-from-pdf":44},[4,8,12,16,20,24,28,32,36,40],{"title":5,"path":6,"description":7},"Compressing Large Images for Websites Without Sacrificing Quality","\u002Fblog\u002Fcompressing-large-images","Large images are one of the most common causes of slow websites. Here's how to compress them effectively, which formats to use, and how to do it without sending your files to a third-party server.",{"title":9,"path":10,"description":11},"How to Extract Images from a PDF (Without Re-encoding Them)","\u002Fblog\u002Fextract-images-from-pdf","PDFs store images as embedded objects inside the file. Here's how to pull them out without quality loss, no upload required.",{"title":13,"path":14,"description":15},"How to Remove Metadata from Photos (Without Uploading Them)","\u002Fblog\u002Fhow-to-remove-metadata-from-photos","Every photo you take embeds GPS coordinates, device information, and timestamps inside the file. Here's what that data looks like, why you should strip it before sharing, and how to do it without sending your photos to a server.",{"title":17,"path":18,"description":19},"How to View EXIF Data Online Without Uploading Your Photos","\u002Fblog\u002Fhow-to-view-exif-data-online","EXIF data is the hidden layer inside your photos — camera settings, GPS coordinates, timestamps and more. Here's what it is, why it matters, and how to view it instantly without uploading your files.",{"title":21,"path":22,"description":23},"Privacy by Design: How re;file labs Uses WASM and Rust to Keep Your Files Local","\u002Fblog\u002Fprivacy-by-design","re;file labs runs image conversion, PDF processing, and metadata editing entirely in your browser using Rust compiled to WebAssembly. Your files never reach a server.",{"title":25,"path":26,"description":27},"How to Reorder and Delete PDF Pages in Your Browser","\u002Fblog\u002Freorder-delete-pdf-pages","Reorder and delete pages in a PDF directly in your browser. No upload, no account, no desktop software required.",{"title":29,"path":30,"description":31},"Why Browser-Based File Tools Are Safer Than Upload-Based Services","\u002Fblog\u002Fsecure-file-editing","Most file tools send your data to a remote server the moment you hit convert. re;file labs runs everything in your browser using WebAssembly — no upload, no account, no third party ever sees your files.",{"title":33,"path":34,"description":35},"WebP vs PNG: Which Image Format Should You Use?","\u002Fblog\u002Fwebp-vs-png","WebP and PNG are both lossless, both support transparency, and both have strong browser support. So which one should you actually use? Here's a practical breakdown.",{"title":37,"path":38,"description":39},"What is a QOI File? The Image Format That Fits in 300 Lines","\u002Fblog\u002Fwhat-is-a-qoi-file","QOI is a lossless image format with a spec so simple you can read it in an afternoon. Here's what it is, how it compares to PNG, and how to open QOI files without installing anything.",{"title":41,"path":42,"description":43},"What is a TGA File and How to Open It","\u002Fblog\u002Fwhat-is-a-tga-file","TGA files are a staple of game development and 3D rendering, but opening them on a modern computer isn't always obvious. Here's what they are and how to view them instantly in your browser.",{"page":45,"surround":390},{"id":46,"title":9,"authors":47,"body":54,"category":354,"date":355,"description":11,"draft":356,"extension":357,"head":358,"image":369,"meta":372,"navigation":302,"ogImage":382,"path":10,"robots":382,"schemaOrg":383,"seo":386,"sitemap":387,"stem":388,"__hash__":389},"blog\u002Fblog\u002Fextract-images-from-pdf.md",[48],{"name":49,"avatar":50,"to":52,"username":53},"Tom Voet",{"src":51},"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F77166831?v=4","https:\u002F\u002Fgithub.com\u002Ftomvoet","tomvoet",{"type":55,"value":56,"toc":346},"minimark",[57,61,65,74,79,82,85,108,111,115,122,125,166,169,173,176,179,189,192,196,199,205,211,217,223,227,234,241,244,248,254,264,321,327,333,336,342],[58,59,9],"h1",{"id":60},"how-to-extract-images-from-a-pdf-without-re-encoding-them",[62,63,64],"p",{},"PDFs hold images as embedded binary objects inside the file. When you want those images back out, most tools take the lazy route: render the page to a bitmap and screenshot it. You lose quality, you lose format information, and you get a PNG of whatever DPI the renderer decided to use. The right approach reads the embedded objects directly and writes them out as-is.",[62,66,67,68,73],{},"The ",[69,70,72],"a",{"href":71},"\u002Fdocument\u002Fextract-images","re;file labs PDF image extractor"," does that. Drop in a PDF, and it pulls the embedded images out of the file, preserving the original encoding where possible. Everything runs locally in your browser via WebAssembly — nothing is uploaded anywhere.",[75,76,78],"h2",{"id":77},"how-pdfs-actually-store-images","How PDFs Actually Store Images",[62,80,81],{},"A PDF isn't a flat canvas. It's a structured document containing objects: fonts, content streams, and image streams. Each image in a PDF is a separate object with its own stream of bytes, compression filter, color space, and dimensions.",[62,83,84],{},"The three most common encodings you'll encounter:",[86,87,88,96,102],"ul",{},[89,90,91,95],"li",{},[92,93,94],"strong",{},"DCTDecode"," — JPEG. The JPEG bitstream is stored directly in the PDF. When you extract it, you get the original JPEG bytes back, with no quality loss.",[89,97,98,101],{},[92,99,100],{},"FlateDecode"," — Zlib-compressed raw pixel data. Common for PNG-style images. The extractor decompresses it and converts to RGBA for export.",[89,103,104,107],{},[92,105,106],{},"JPXDecode"," — JPEG 2000. Less common, mostly in PDFs generated by Adobe products. Stored as a raw JP2 bitstream.",[62,109,110],{},"Scanned documents are a special case. They're typically stored as a single large image per page (often DCTDecode), so extracting \"images from a scanned PDF\" gives you one image per page at whatever resolution the scan was done. That's expected behavior, not a bug.",[75,112,114],{"id":113},"using-the-extractor","Using the Extractor",[62,116,117,118,121],{},"Go to the ",[69,119,120],{"href":71},"PDF image extractor",", drop in a PDF, and it immediately scans the file for image objects. Each extracted image appears in a grid with its page number, index on that page, format (JPEG, JP2, or PNG), and pixel dimensions.",[62,123,124],{},"Download options:",[86,126,127,133,139,154],{},[89,128,129,132],{},[92,130,131],{},"Individual download"," — click any image in the grid, or hover it for the download button",[89,134,135,138],{},[92,136,137],{},"Download all individually"," — triggers browser downloads for every image at once",[89,140,141,144,145,149,150,153],{},[92,142,143],{},"ZIP (flat)"," — everything in a single folder, named ",[146,147,148],"code",{},"page1_image1.jpg",", ",[146,151,152],{},"page1_image2.jpg",", etc.",[89,155,156,159,160,149,163],{},[92,157,158],{},"ZIP (by page)"," — organized into subfolders: ",[146,161,162],{},"page-1\u002Fimage1.jpg",[146,164,165],{},"page-2\u002Fimage1.jpg",[62,167,168],{},"The ZIP option is the practical one for PDFs with many images. Triggering 40 individual browser downloads for a product catalog is not something you want to do.",[75,170,172],{"id":171},"what-happens-to-cmyk-images","What Happens to CMYK Images",[62,174,175],{},"PDF images can use color spaces your browser doesn't natively understand: DeviceGray, DeviceRGB, DeviceCMYK, CalGray, CalRGB, Lab, and ICCBased among them. JPEG images stored in CMYK (common for print-workflow PDFs) get converted to RGBA on export, since browsers can't display CMYK JPEGs directly.",[62,177,178],{},"The conversion formula is straightforward:",[180,181,186],"pre",{"className":182,"code":184,"language":185},[183],"language-text","R = (1 - C) × (1 - K) × 255\nG = (1 - M) × (1 - K) × 255\nB = (1 - Y) × (1 - K) × 255\n","text",[146,187,184],{"__ignoreMap":188},"",[62,190,191],{},"Grayscale images get expanded to RGBA too, with the same value in R, G, and B channels. If you're doing print work and need the raw CMYK data, this extractor won't give you that — you'd need a tool that preserves ICC profiles and CMYK channels end-to-end.",[75,193,195],{"id":194},"why-images-sometimes-look-wrong-or-go-missing","Why Images Sometimes Look Wrong or Go Missing",[62,197,198],{},"A few common failure modes:",[62,200,201,204],{},[92,202,203],{},"Mask images."," PDFs can embed soft masks or stencil masks as separate image objects. These show up as extracted images but look like noise or solid blocks. They're not bugs in the extractor — they're legitimate embedded objects that only make visual sense when composited with the image they mask. The PDF spec has about 800 pages of this energy.",[62,206,207,210],{},[92,208,209],{},"Tiled patterns."," Some PDFs use tiling pattern color spaces where what appears as a large image is actually a small tile repeated across the page. Each tile is a tiny image object. You'll get many small extracts instead of one large one.",[62,212,213,216],{},[92,214,215],{},"Encrypted or protected PDFs."," Password-protected PDFs need to be unlocked before any object extraction can happen. The extractor won't attempt to brute-force or bypass encryption — just decrypt the file first.",[62,218,219,222],{},[92,220,221],{},"Unusual filters."," Filters like LZWDecode, CCITTFaxDecode (used in fax-style scans), and JBIG2Decode (black-and-white bitmaps, common in scanned legal documents) aren't handled. Images using those filters are skipped. This covers a small fraction of real-world PDFs but does exist.",[75,224,226],{"id":225},"how-it-runs-locally","How It Runs Locally",[62,228,229,230,233],{},"The extraction logic is a Rust function compiled to WebAssembly. It uses the ",[146,231,232],{},"lopdf"," crate to parse the PDF structure and iterate over page image objects, then handles decompression and color space conversion before passing the result back to JavaScript.",[62,235,236,237,240],{},"No server is involved at any point. The PDF bytes are read into a ",[146,238,239],{},"Uint8Array"," in the browser, passed directly to the WASM module, and the extracted image data comes back as typed arrays. The whole process happens in memory on your device.",[62,242,243],{},"That matters for PDFs containing sensitive content — internal documents, contracts, reports. Sending those to a third-party server to extract a logo or chart is a bad trade. The local approach sidesteps that entirely.",[75,245,247],{"id":246},"comparing-to-other-approaches","Comparing to Other Approaches",[62,249,250,253],{},[92,251,252],{},"Adobe Acrobat"," (Pro, not Reader) has an Export Images tool that does essentially the same thing. It handles more edge cases and preserves ICC profiles. If you have Acrobat Pro and need production-quality extraction for print workflows, use that.",[62,255,256,259,260,263],{},[92,257,258],{},"pdfimages"," (part of Poppler, available via ",[146,261,262],{},"brew install poppler"," on Mac or most Linux package managers) is the command-line equivalent:",[180,265,269],{"className":266,"code":267,"language":268,"meta":188,"style":188},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# Extract all images, preserving native format where possible\npdfimages -all input.pdf output\u002Fprefix\n\n# List what's in the PDF without extracting\npdfimages -list input.pdf\n","bash",[146,270,271,280,297,304,310],{"__ignoreMap":188},[272,273,276],"span",{"class":274,"line":275},"line",1,[272,277,279],{"class":278},"sutJx","# Extract all images, preserving native format where possible\n",[272,281,283,286,290,294],{"class":274,"line":282},2,[272,284,258],{"class":285},"sbgvK",[272,287,289],{"class":288},"stzsN"," -all",[272,291,293],{"class":292},"s_sjI"," input.pdf",[272,295,296],{"class":292}," output\u002Fprefix\n",[272,298,300],{"class":274,"line":299},3,[272,301,303],{"emptyLinePlaceholder":302},true,"\n",[272,305,307],{"class":274,"line":306},4,[272,308,309],{"class":278},"# List what's in the PDF without extracting\n",[272,311,313,315,318],{"class":274,"line":312},5,[272,314,258],{"class":285},[272,316,317],{"class":288}," -list",[272,319,320],{"class":292}," input.pdf\n",[62,322,67,323,326],{},[146,324,325],{},"-all"," flag preserves JPEG encoding. Without it, pdfimages decodes everything to PPM — the format nobody asked for but everyone eventually receives. For batch processing or scripted workflows, pdfimages is the right tool.",[62,328,329,332],{},[92,330,331],{},"Online tools"," like Smallpdf, ILovePDF, and PDF24 all upload your file to their servers. That's fine for non-sensitive PDFs where convenience matters more. For anything confidential, it's worth using a local option.",[62,334,335],{},"The re;file labs extractor sits in the middle: browser-based convenience, local-only processing. No install, no upload, no account.",[62,337,338,339,341],{},"Try the ",[69,340,120],{"href":71}," and see what's actually embedded in your PDFs.",[343,344,345],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":188,"searchDepth":282,"depth":282,"links":347},[348,349,350,351,352,353],{"id":77,"depth":282,"text":78},{"id":113,"depth":282,"text":114},{"id":171,"depth":282,"text":172},{"id":194,"depth":282,"text":195},{"id":225,"depth":282,"text":226},{"id":246,"depth":282,"text":247},"PDF Tools","2026-03-18T00:00:00.000Z",false,"md",{"script":359},[360],{"type":361,"key":362,"data-nuxt-schema-org":302,"nodes":363},"application\u002Fld+json","schema-org-graph",[364],{"headline":9,"author":365,"datePublished":367,"@type":368},{"name":49,"url":52,"@type":366},"Person","2026-03-18","BlogPosting",{"src":370,"alt":371},"\u002Fblog\u002Fextract-images-from-pdf.webp","A browser window showing a grid of images extracted from a PDF file",{"relatedPages":373},[374,376,379],{"path":71,"title":375},"PDF Image Extractor",{"path":377,"title":378},"\u002Fdocument\u002Fextract-text","PDF Text Extractor",{"path":380,"title":381},"\u002Fdocument\u002Fpdf","PDF Editor",null,[384],{"headline":9,"author":385,"datePublished":367,"@type":368},{"name":49,"url":52,"@type":366},{"title":9,"description":11},{"loc":10},"blog\u002Fextract-images-from-pdf","7TPwJKKNhC2mpfkPH8ccgUi88kFY6hBgRTjJxKRS_dk",[382,391],{"title":13,"path":14,"stem":392,"description":15,"children":-1},"blog\u002Fhow-to-remove-metadata-from-photos",1774281533233]