Spaces:
Sleeping
Sleeping
File size: 2,501 Bytes
fb3f182 dfabe96 a492b64 fb3f182 dfabe96 ce26bd4 dfabe96 ce26bd4 dfabe96 fb3f182 0d4407b fb3f182 dfabe96 fb3f182 dfabe96 d332c6c dfabe96 d332c6c dfabe96 d332c6c fb3f182 d332c6c fb3f182 dfabe96 fb3f182 d332c6c dfabe96 fb3f182 dfabe96 d332c6c dfabe96 d332c6c fb3f182 d332c6c dfabe96 fb3f182 d332c6c dfabe96 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#!/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)
|