Spaces:
Sleeping
Sleeping
| #!/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") # <name>_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) | |