Convert PDF to Images with Python
Converting PDF pages to PNG or JPEG images is useful for previews, OCR processing, and thumbnail generation. Python offers pdf2image (poppler-based) and PyMuPDF (fitz).
Option 1: pdf2image + poppler
pip install pdf2image pillow
# Poppler backend:
# Windows: https://github.com/oschwartz10612/poppler-windows (extract to C:/poppler)
# macOS: brew install poppler
# Linux: apt install poppler-utils
Basic PDF to PNG Conversion
from pdf2image import convert_from_path
from pathlib import Path
def pdf_to_png(pdf_path, output_dir="pages", dpi=150):
Path(output_dir).mkdir(exist_ok=True)
pages = convert_from_path(pdf_path, dpi=dpi)
paths = []
for i, page in enumerate(pages, 1):
path = f"{output_dir}/page_{i:03d}.png"
page.save(path, "PNG")
paths.append(path)
print(f" Page {i}/{len(pages)}: {path}")
print(f"Converted {len(pages)} pages")
return paths
pdf_to_png("document.pdf", dpi=200)
Convert Specific Pages
from pdf2image import convert_from_path
# Pages 2-5 (first_page/last_page are 1-indexed)
pages = convert_from_path("report.pdf", dpi=150, first_page=2, last_page=5)
for i, page in enumerate(pages, 2):
page.save(f"page_{i}.jpg", "JPEG", quality=85)
print(f"Exported {len(pages)} pages")
Export to JPEG with Quality Control
from pdf2image import convert_from_path
from pathlib import Path
def pdf_to_jpeg(pdf_path, output_dir, dpi=150, quality=85):
Path(output_dir).mkdir(exist_ok=True)
pages = convert_from_path(pdf_path, dpi=dpi, fmt="jpeg")
for i, page in enumerate(pages, 1):
page.save(f"{output_dir}/page_{i:03d}.jpg", "JPEG", quality=quality)
print(f"Exported {len(pages)} pages as JPEG (quality={quality})")
pdf_to_jpeg("catalog.pdf", "thumbnails", dpi=100, quality=75)
Option 2: PyMuPDF (fitz) — Faster, No poppler
pip install pymupdf
Convert with PyMuPDF
import fitz # PyMuPDF
def pdf_to_images_fitz(pdf_path, output_dir="pages", dpi=150):
from pathlib import Path
Path(output_dir).mkdir(exist_ok=True)
doc = fitz.open(pdf_path)
zoom = dpi / 72 # PDF base is 72 DPI
mat = fitz.Matrix(zoom, zoom)
paths = []
for i, page in enumerate(doc):
pixmap = page.get_pixmap(matrix=mat)
path = f"{output_dir}/page_{i+1:03d}.png"
pixmap.save(path)
paths.append(path)
print(f" Page {i+1}/{doc.page_count}")
doc.close()
return paths
pdf_to_images_fitz("document.pdf", dpi=200)
Generate First-Page Thumbnail
import fitz
from PIL import Image
import io
def pdf_thumbnail(pdf_path, output, width=300):
doc = fitz.open(pdf_path)
page = doc[0]
zoom = width / page.rect.width
pixmap = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom))
img = Image.open(io.BytesIO(pixmap.tobytes("png")))
img.save(output)
doc.close()
print(f"Thumbnail: {output} ({img.width}x{img.height}px)")
pdf_thumbnail("report.pdf", "thumb.jpg")
Extract Embedded Images from PDF
import fitz
from pathlib import Path
def extract_pdf_images(pdf_path, output_dir="images"):
Path(output_dir).mkdir(exist_ok=True)
doc = fitz.open(pdf_path)
counter = 0
for page_num, page in enumerate(doc):
for img_idx, img in enumerate(page.get_images()):
xref = img[0]
image = doc.extract_image(xref)
path = f"{output_dir}/img_p{page_num+1}_{img_idx+1}.{image['ext']}"
with open(path, "wb") as f:
f.write(image["image"])
counter += 1
doc.close()
print(f"Extracted {counter} images to {output_dir}/")
extract_pdf_images("catalog.pdf")
pdf2image vs PyMuPDF Comparison
| Feature | pdf2image | PyMuPDF (fitz) |
|---|---|---|
| Extra dependency | poppler | None |
| Speed | Medium | High |
| Quality | Excellent | Excellent |
| Extract embedded images | No | Yes |
| Memory usage | All pages | One at a time |
Additional Resource
For converting PDF to JPG, PNG or WebP without any coding, use KaijuConverter — free and no registration required.
Related conversions
Document conversions that follow this topic naturally: