"""PDF helper for the STCourses importer. Run as: python -I pdf_tool.py render [--width 1280] [--quality 80] Writes outdir/p-001.jpg ... and outdir/text.json ([{"page": 1, "text": "..."}]). Prints one "page N/M" line per page on stdout and a final JSON line {"pages": M, "title": "..."}. """ import json import os import sys try: import pymupdf as fitz except ImportError: # older PyMuPDF import fitz def render(pdf, outdir, width, quality): os.makedirs(outdir, exist_ok=True) doc = fitz.open(pdf) n = len(doc) texts = [] for i, page in enumerate(doc, start=1): zoom = width / max(page.rect.width, 1) pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom), alpha=False) pix.save(os.path.join(outdir, "p-%03d.jpg" % i), jpg_quality=quality) texts.append({"page": i, "text": page.get_text().strip()}) print("page %d/%d" % (i, n), flush=True) with open(os.path.join(outdir, "text.json"), "w", encoding="utf-8") as f: json.dump(texts, f, ensure_ascii=False) print(json.dumps({"pages": n, "title": (doc.metadata or {}).get("title") or ""}), flush=True) def main(argv): if len(argv) < 4 or argv[1] != "render": print("usage: pdf_tool.py render [--width N] [--quality N]", file=sys.stderr) return 2 width, quality = 1280, 80 rest = argv[4:] while rest: flag, val = rest[0], rest[1] if len(rest) > 1 else "" if flag == "--width": width = int(val) elif flag == "--quality": quality = int(val) rest = rest[2:] render(argv[2], argv[3], width, quality) return 0 if __name__ == "__main__": sys.exit(main(sys.argv))