diff --git a/pdf_to_jpg.py b/pdf_to_jpg.py new file mode 100755 index 0000000..0fc8e24 --- /dev/null +++ b/pdf_to_jpg.py @@ -0,0 +1,52 @@ +#!/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()