From 6a888b8cb818e5bc227c79d4e6bb44dd63ed2d6f Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Thu, 26 Jun 2025 21:03:03 +0800 Subject: [PATCH] 'commit' --- dsRag/Start.py | 40 +++++++++++++++++++++++++++++++++ dsRag/Test/TestWriteDoc.py | 44 +++++++++++++++++++++++++++++++++++++ dsRag/Test/__init__.py | 0 dsRag/Test/output.docx | Bin 0 -> 36622 bytes dsRag/static/ai.html | 43 ++++++++++++++++++++++++++++++++++-- 5 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 dsRag/Test/TestWriteDoc.py create mode 100644 dsRag/Test/__init__.py create mode 100644 dsRag/Test/output.docx diff --git a/dsRag/Start.py b/dsRag/Start.py index ba49b059..6e56680e 100644 --- a/dsRag/Start.py +++ b/dsRag/Start.py @@ -15,6 +15,10 @@ from Config.Config import MS_MODEL_PATH, MS_MODEL_LIMIT, MS_HOST, MS_PORT, MS_MA from Milvus.Utils.MilvusCollectionManager import MilvusCollectionManager from Milvus.Utils.MilvusConnectionPool import * from Milvus.Utils.MilvusConnectionPool import MilvusConnectionPool +from docx import Document +from docx.shared import Inches +from io import BytesIO +import html2text # 初始化日志 logger = logging.getLogger(__name__) @@ -156,6 +160,42 @@ http://10.10.21.22:8000/static/ai.html class QueryRequest(BaseModel): query: str = Field(..., description="用户查询的问题") +class SaveWordRequest(BaseModel): + html: str = Field(..., description="要保存为Word的HTML内容") + +@app.post("/api/save-word") +async def save_to_word(request: Request): + try: + data = await request.json() + save_request = SaveWordRequest(**data) + except ValidationError as e: + logger.error(f"请求体验证失败: {e.errors()}") + raise HTTPException(status_code=422, detail=e.errors()) + except Exception as e: + logger.error(f"请求解析失败: {str(e)}") + raise HTTPException(status_code=400, detail="无效的请求格式") + + # 转换HTML为纯文本 + h = html2text.HTML2Text() + h.ignore_links = True + plain_text = h.handle(save_request.html) + + # 创建Word文档 + doc = Document() + doc.add_heading('小学数学问答', 0) + doc.add_paragraph(plain_text) + + # 保存到内存中的字节流 + file_stream = BytesIO() + doc.save(file_stream) + file_stream.seek(0) + + return StreamingResponse( + file_stream, + media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", + headers={"Content-Disposition": "attachment; filename=小学数学问答.docx"} + ) + @app.post("/api/rag") async def rag_stream(request: Request): try: diff --git a/dsRag/Test/TestWriteDoc.py b/dsRag/Test/TestWriteDoc.py new file mode 100644 index 00000000..dc8469e1 --- /dev/null +++ b/dsRag/Test/TestWriteDoc.py @@ -0,0 +1,44 @@ +from bs4 import BeautifulSoup +from docx import Document +""" +pip install python-docx html2text beautifulsoup4 +""" + +def html_to_word(html_content, word_path): + # 解析 HTML + soup = BeautifulSoup(html_content, 'html.parser') + + # 创建 Word 文档 + doc = Document() + + # 遍历 HTML 的所有段落 + for element in soup.find_all(['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div']): + # 获取文本内容 + text = element.get_text(strip=True) + if text: + # 添加到 Word 文档 + doc.add_paragraph(text) + + # 保存 Word 文档 + doc.save(word_path) + print(f"HTML content saved to {word_path}") + + +# 示例 HTML 内容 +html_content = """ + + + + Sample HTML + + +

Heading 1

+

This is a paragraph.

+

Heading 2

+
Content inside a div.
+ + +""" + +# 调用函数 +html_to_word(html_content, "output.docx") \ No newline at end of file diff --git a/dsRag/Test/__init__.py b/dsRag/Test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dsRag/Test/output.docx b/dsRag/Test/output.docx new file mode 100644 index 0000000000000000000000000000000000000000..e389e6231d1a3ce0d3d99fe3f67cdc6896d9b3c9 GIT binary patch literal 36622 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 literal 0 HcmV?d00001 diff --git a/dsRag/static/ai.html b/dsRag/static/ai.html index ead942c5..b724b497 100644 --- a/dsRag/static/ai.html +++ b/dsRag/static/ai.html @@ -90,7 +90,7 @@ background-color: #d32f2f; } - #downloadBtn { + #saveWordBtn { background-color: #4CAF50; color: white; border: none; @@ -99,12 +99,20 @@ border-radius: 5px; cursor: pointer; transition: background-color 0.3s; + display: flex; + align-items: center; + gap: 8px; } - #downloadBtn:hover { + #saveWordBtn:hover { background-color: #45a049; } + #saveWordBtn::before { + content: "\1F4C4"; /* Word文档图标 */ + font-size: 18px; + } + .status { text-align: center; margin-bottom: 20px; @@ -163,7 +171,38 @@ + + +