#!/usr/bin/env -S uv run --script # /// script # dependencies = ["pdf2image", "Pillow"] # /// import argparse import logging from pathlib import Path import pdf2image from PIL import Image logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s") def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Convert PDF pages to JPG images.", formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("pdf_path", type=Path, help="Path to the PDF file.") return parser.parse_args() def save_images(images: list[Image.Image], save_dir: Path, base_name: str) -> None: for i, img in enumerate(images, start=1): width, height = img.size if width > 2000: ratio = 2000 / width new_size = (2000, int(height * ratio)) img = img.resize(new_size, resample=Image.LANCZOS) out_path = save_dir / f"{base_name}-{i:03d}.jpg" img.save(out_path, format="JPEG") logging.info(f"Saved {out_path}") def main() -> None: args = parse_args() pdf_path: Path = args.pdf_path if not pdf_path.exists(): logging.error(f"File not found: {pdf_path}") return try: images = pdf2image.convert_from_path(pdf_path=str(pdf_path)) except Exception as e: logging.error(f"Failed to convert PDF: {e}") return save_images( images=images, save_dir=pdf_path.parent, base_name=pdf_path.stem, ) if __name__ == "__main__": main()