51 lines
1.7 KiB
Python
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))
|