File size: 2,558 Bytes
4236491
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
72
73
74
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)