Spaces:
Sleeping
Sleeping
import requests | |
import gradio as gr | |
from io import BytesIO | |
from docx import Document | |
from docx.enum.text import WD_ALIGN_PARAGRAPH | |
from docx.shared import Pt | |
def create_docx(text: str) -> BytesIO: | |
"""创建Word文档并返回内存字节流""" | |
doc = Document() | |
for paragraph_text in text.split('\n'): | |
if paragraph_text.strip(): # 跳过空行 | |
p = doc.add_paragraph() | |
p.alignment = WD_ALIGN_PARAGRAPH.CENTER | |
run = p.add_run(paragraph_text.strip()) | |
run.font.name = '楷体' | |
run.font.size = Pt(12) | |
output = BytesIO() | |
doc.save(output) | |
output.seek(0) | |
return output | |
def upload_to_tempfiles(doc_stream: BytesIO) -> str: | |
"""上传文档到临时文件托管平台""" | |
filename = "document.docx" | |
api_url = "https://tmpfiles.org/api/v1/upload" | |
files = {'file': (filename, doc_stream, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')} | |
try: | |
response = requests.post(api_url, files=files) | |
if response.status_code == 200: | |
response_json = response.json() | |
if response_json.get('status') == 'success' and 'data' in response_json and 'url' in response_json['data']: | |
return response_json['data']['url'] | |
return "上传失败" | |
except Exception: | |
return "上传失败" | |
def process_text(text: str) -> dict: | |
"""处理API请求的核心函数(无需API Key)""" | |
# 处理空文本 | |
if not text.strip(): | |
return {"output": "输入文本不能为空"} | |
# 创建并上传文档 | |
try: | |
doc_stream = create_docx(text) | |
file_url = upload_to_tempfiles(doc_stream) | |
doc_stream.close() | |
return {"output": file_url} | |
except Exception as e: | |
return {"output": f"处理失败: {str(e)}"} | |
# 创建Gradio接口 | |
app = gr.Interface( | |
fn=process_text, | |
inputs=gr.Textbox(label="输入文本", lines=5), | |
outputs=gr.JSON(label="处理结果"), | |
title="文本转DOCX API", | |
description="输入文本将转为楷体居中的DOCX文档,返回文件托管URL", | |
flagging_mode="never" | |
) | |
# 启动应用 | |
if __name__ == "__main__": | |
app.launch(server_name="0.0.0.0", server_port=7860) |