#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os, sys, shutil, subprocess, tempfile, uuid from pathlib import Path import gradio as gr BASE_DIR = Path(__file__).parent.resolve() BINARY_PATH = BASE_DIR / "PptxToJpgZip" os.chmod(BINARY_PATH, 0o755) # 忽略异常 # -------- 省略 install_fonts_from_repository(),保持之前版本 -------- # def _safe_name() -> str: """生成仅 ASCII 的临时文件名""" return f"input_{uuid.uuid4().hex}.pptx" def convert_pptx_to_zip(pptx_file) -> str: """调用 PptxToJpgZip,把 PPTX 转成图片 ZIP;若仅有文件夹则自动 zip。""" tmpdir = Path(tempfile.mkdtemp()) src = tmpdir / _safe_name() shutil.copy(pptx_file.name, src) # 调用外部可执行文件 proc = subprocess.run( [str(BINARY_PATH), str(src)], cwd=tmpdir, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) if proc.returncode != 0: raise RuntimeError( f"PptxToJpgZip 失败,退出码 {proc.returncode}\n" f"stderr:\n{proc.stderr.decode(errors='ignore')}" ) # ---- ① 优先找 *_images.zip ---- zips = list(tmpdir.glob("*_images.zip")) if zips: return str(zips[0]) # ---- ② 若无 ZIP,再找 *_images 目录,自动打包 ---- img_dirs = [p for p in tmpdir.glob("*_images") if p.is_dir()] if img_dirs: folder = img_dirs[0] zip_path = folder.with_suffix(".zip") # _images.zip shutil.make_archive(zip_path.with_suffix(""), "zip", folder) return str(zip_path) # ---- ③ 仍没找到:列出 tmpdir 内容方便调试 ---- contents = "\n".join([" • " + p.name for p in tmpdir.iterdir()]) raise FileNotFoundError( "未找到输出 ZIP,也未发现 *_images 文件夹。\n" f"临时目录内容:\n{contents}" ) # ----------------- Gradio UI 保持不变 ----------------- # with gr.Blocks(title="PPTX→JPG→ZIP 转换器") as demo: gr.Markdown( """ # PPTX→JPG→ZIP 上传 `.pptx`,后台调用 **PptxToJpgZip**,将每页导出为 JPG 并打包 ZIP。""" ) with gr.Row(): pptx_in = gr.File(label="上传 PPTX (.pptx)", file_types=[".pptx"]) btn = gr.Button("开始转换") zip_out = gr.File(label="下载 ZIP 文件") btn.click(fn=convert_pptx_to_zip, inputs=pptx_in, outputs=zip_out) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860, share=False)