From 420e20a8cf56ffe3ba4ef6b0d0000be9c8dd5c7c Mon Sep 17 00:00:00 2001 From: Alex-Gilbert Date: Sun, 15 Feb 2026 18:38:50 -0600 Subject: [PATCH] feat: PDF rasterization module Add rasterize_pdf() that converts PDF pages to PIL images using pdf2image. Supports configurable DPI and page range selection. Includes tests verifying multi-page output, high-DPI dimensions, and single-page extraction. Co-Authored-By: Claude Opus 4.6 --- tests/test_rasterize.py | 24 ++++++++++++++++++++++++ unredact/pipeline/rasterize.py | 19 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 tests/test_rasterize.py create mode 100644 unredact/pipeline/rasterize.py diff --git a/tests/test_rasterize.py b/tests/test_rasterize.py new file mode 100644 index 0000000..9ddfa51 --- /dev/null +++ b/tests/test_rasterize.py @@ -0,0 +1,24 @@ +from pathlib import Path + +from PIL import Image + +from unredact.pipeline.rasterize import rasterize_pdf + + +def test_rasterize_returns_list_of_images(sample_pdf: Path): + pages = rasterize_pdf(sample_pdf) + assert len(pages) == 2 # EFTA00554620.pdf has 2 pages + assert all(isinstance(p, Image.Image) for p in pages) + + +def test_rasterize_high_dpi(sample_pdf: Path): + pages = rasterize_pdf(sample_pdf, dpi=300) + # At 300 DPI, a letter-size page is roughly 2550x3300 + w, h = pages[0].size + assert w > 2000 + assert h > 3000 + + +def test_rasterize_single_page(sample_pdf: Path): + pages = rasterize_pdf(sample_pdf, first_page=1, last_page=1) + assert len(pages) == 1 diff --git a/unredact/pipeline/rasterize.py b/unredact/pipeline/rasterize.py new file mode 100644 index 0000000..4c59452 --- /dev/null +++ b/unredact/pipeline/rasterize.py @@ -0,0 +1,19 @@ +from pathlib import Path + +from pdf2image import convert_from_path +from PIL import Image + + +def rasterize_pdf( + pdf_path: Path, + dpi: int = 300, + first_page: int | None = None, + last_page: int | None = None, +) -> list[Image.Image]: + """Convert PDF pages to PIL images at the given DPI.""" + kwargs: dict = {"dpi": dpi} + if first_page is not None: + kwargs["first_page"] = first_page + if last_page is not None: + kwargs["last_page"] = last_page + return convert_from_path(str(pdf_path), **kwargs)