Files
STCourses/packages/feature-import/py/pdf_tool.py
T

51 lines
1.7 KiB
Python

"""PDF helper for the STCourses importer. Run as: python -I pdf_tool.py render <pdf> <outdir> [--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 <pdf> <outdir> [--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))