Spaces:
Sleeping
Sleeping
| import os | |
| 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 | |
| SECRET_KEY = os.getenv("API_KEY", "default_secret_key") # 从环境变量获取apikey | |
| 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(request: gr.Request, text: str) -> dict: | |
| """处理API请求的核心函数""" | |
| # 验证apikey | |
| api_key = request.headers.get("apikey", "") | |
| if api_key != SECRET_KEY: | |
| return {"output": "无效的API密钥"} | |
| # 处理空文本 | |
| 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", | |
| allow_flagging="never" | |
| ) | |
| # 启动应用 | |
| if __name__ == "__main__": | |
| app.launch(api_open=False, show_api=True) |