Spaces:
Running
Running
#!/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) | |