"""Command-line interface for px-image2pptx. Usage:: # Full pipeline (OCR + textmask + inpaint + PPTX) px-image2pptx slide.png -o output.pptx # With pre-computed OCR px-image2pptx slide.png -o output.pptx --ocr-json text_regions.json # Skip inpainting (solid background or use original) px-image2pptx slide.png -o output.pptx --skip-inpaint # Chinese slide px-image2pptx slide.png -o output.pptx --lang ch # Keep intermediate files px-image2pptx slide.png -o output.pptx --work-dir ./debug/ """ from __future__ import annotations import argparse import sys import time def _parse_args(argv=None): parser = argparse.ArgumentParser( prog="px-image2pptx", description="Convert static images to editable PowerPoint slides.", formatter_class=argparse.RawDescriptionHelpFormatter, epilog="""\ examples: px-image2pptx slide.png -o output.pptx px-image2pptx slide.png -o output.pptx --lang ch px-image2pptx slide.png -o output.pptx --skip-inpaint px-image2pptx slide.png -o output.pptx --ocr-json ocr.json px-image2pptx slide.png -o output.pptx --work-dir ./debug/ """, ) parser.add_argument("image", help="Input image (PNG/JPG/WebP)") parser.add_argument("-o", "--output", default="output.pptx", help="Output PPTX path (default: output.pptx)") parser.add_argument("--ocr-json", default=None, help="Pre-computed OCR JSON (skips OCR step)") parser.add_argument("--lang", default="auto", choices=["auto", "en", "ch"], help="OCR language (default: auto-detect)") parser.add_argument("--sensitivity", type=float, default=16, help="Textmask sensitivity (default: 16)") parser.add_argument("--dilation", type=int, default=12, help="Textmask dilation pixels (default: 12)") parser.add_argument("--min-font", type=int, default=8, help="Minimum font size in points (default: 8)") parser.add_argument("--max-font", type=int, default=72, help="Maximum font size in points (default: 72)") parser.add_argument("--skip-inpaint", action="store_true", help="Skip LAMA inpainting (use original or solid bg)") parser.add_argument("--max-inpaint-size", type=int, default=None, help="Downscale longer edge to N px before inpainting " "(e.g. 2048). Reduces time for large images.") parser.add_argument("--work-dir", default=None, help="Directory for intermediate files") return parser.parse_args(argv) def main(argv=None): args = _parse_args(argv) from px_image2pptx.pipeline import image_to_pptx t0 = time.time() report = image_to_pptx( image_path=args.image, output_path=args.output, ocr_json=args.ocr_json, lang=args.lang, sensitivity=args.sensitivity, dilation=args.dilation, min_font=args.min_font, max_font=args.max_font, skip_inpaint=args.skip_inpaint, max_inpaint_size=args.max_inpaint_size, work_dir=args.work_dir, ) elapsed = time.time() - t0 print(f"Saved: {args.output}") print(f" Text boxes: {report['text_boxes']}") print(f" OCR regions: {report['ocr_regions']}") print(f" Background: {report['background']}") print(f" Slide: {report['slide_size']['width_inches']}x" f"{report['slide_size']['height_inches']}\"") print(f" Time: {elapsed:.1f}s", end="") if "timings" in report: t = report["timings"] parts = [f"{k}={v}s" for k, v in t.items()] print(f" ({', '.join(parts)})") else: print() if __name__ == "__main__": main()