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)