From 380b4d7dc91eef642ab3bda3d0ca163ae3ca5e83 Mon Sep 17 00:00:00 2001 From: xunbu Date: Wed, 21 May 2025 20:49:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BA=86=E6=89=93=E5=8C=85?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 125 +- README.md | 16 +- docutranslate/app.py | 20 +- docutranslate/converter/__init__.py | 3 + docutranslate/static/DocuTranslate.ico | Bin 0 -> 29369 bytes docutranslate/static/index.html | 85 +- full.spec | 10 +- full_onefile.spec | 46 + pyproject.toml | 18 +- requirements.txt | 369 +++++ uv.lock | 2093 +++++++++++++++++++++++- 11 files changed, 2626 insertions(+), 159 deletions(-) create mode 100644 docutranslate/static/DocuTranslate.ico create mode 100644 full_onefile.spec create mode 100644 requirements.txt diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2efba06..a8f510b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,11 +5,15 @@ - + + + + - + + @@ -41,76 +45,76 @@ - { - "keyToString": { - "DefaultHtmlFileTemplate": "HTML File", - "JavaScript 调试.output.html (1).executor": "Run", - "JavaScript 调试.output.html.executor": "Run", - "JavaScript 调试.regex.md_中文.html.executor": "Run", - "JavaScript 调试.regex_中文.html.executor": "Run", - "JavaScript 调试.test.html.executor": "Run", - "JavaScript 调试.test2.html.executor": "Run", - "JavaScript 调试.test2_英文.html.executor": "Run", - "JavaScript 调试.test4-1_中文.html.executor": "Run", - "JavaScript 调试.互联网认证授权机制.html.executor": "Run", - "JavaScript 调试.互联网认证授权机制_英文.html.executor": "Run", - "JavaScript 调试.毕业论文_英文.html.executor": "Run", - "ModuleVcsDetector.initialDetectionPerformed": "true", - "Python 测试.Python 测试 (markdown_mask.py 内).executor": "Run", - "Python 测试.markdown_mask.Test.test_basic_link_masking 的 Python 测试.executor": "Run", - "Python 测试.pytest (test_html.py 内).executor": "Run", - "Python.1test.executor": "Run", - "Python.2test2 (1).executor": "Run", - "Python.PDFtranslater (1).executor": "Run", - "Python.PDFtranslater (2).executor": "Run", - "Python.agent.executor": "Debug", - "Python.agent_utils.executor": "Run", - "Python.app (1).executor": "Run", - "Python.app.executor": "Run", - "Python.app2.executor": "Run", - "Python.app_test (1).executor": "Run", - "Python.convert.executor": "Run", - "Python.converter_docling.executor": "Run", - "Python.converter_mineru.executor": "Run", - "Python.markdown_splitter.executor": "Debug", - "Python.markdown_utils.executor": "Run", - "Python.test.executor": "Run", - "Python.test1.executor": "Run", - "Python.test2.executor": "Run", - "Python.test3.executor": "Run", - "Python.test4.executor": "Run", - "Python.testhtml.executor": "Run", - "Python.translater.executor": "Run", - "Python.切分测试.executor": "Run", - "RunOnceActivity.ShowReadmeOnStart": "true", - "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager": "true", - "RunOnceActivity.git.unshallow": "true", - "git-widget-placeholder": "dev", - "last_opened_file_path": "C:/Users/jxgm/Desktop/translate/docutranslate", - "list.type.of.created.stylesheet": "CSS", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "settings.editor.selected.configurable": "preferences.pluginManager", - "vue.rearranger.settings.migration": "true" + +}]]> + - + - @@ -607,6 +611,7 @@ + @@ -625,7 +630,7 @@ - + diff --git a/README.md b/README.md index c58fc46..b700b57 100644 --- a/README.md +++ b/README.md @@ -19,18 +19,18 @@ # 安装 使用pip -`pip install docutranslate` -`pip install docling`#如果使用docling进行文档解析 +1. `pip install docutranslate` +2. `pip install docling`#如果使用docling进行文档解析 使用uv -`uv init` -`uv add docutranslate` -`uv add docling`#如果使用docling进行文档解析 +1. `uv init` +2. `uv add docutranslate` +3. `uv add docling`#如果使用docling进行文档解析 使用git -`git clone https://github.com/xunbu/docutranslate.git` -`uv sync` - +1. `git clone https://github.com/xunbu/docutranslate.git` +2. `uv sync` +3. `uv pip install -U -e .` # 支持的文件格式 | 输入格式 | 输出格式 | diff --git a/docutranslate/app.py b/docutranslate/app.py index 8c8d600..faf27a1 100644 --- a/docutranslate/app.py +++ b/docutranslate/app.py @@ -2,6 +2,7 @@ import asyncio import io import logging import time +from contextlib import asynccontextmanager from pathlib import Path from typing import List, Dict, Any, Optional from urllib.parse import quote @@ -10,17 +11,12 @@ import uvicorn from fastapi import FastAPI, File, Form, UploadFile, Request, HTTPException from fastapi.responses import HTMLResponse, JSONResponse, StreamingResponse,FileResponse from fastapi.staticfiles import StaticFiles -from docutranslate import FileTranslater # Assuming FileTranslater is in docutranslate module +from docutranslate import FileTranslater from docutranslate.logger import translater_logger from docutranslate.utils.resource_utils import resource_path from docutranslate.global_values import available_packages - DOCLING_EXIST=True if available_packages.get("docling") else False -app = FastAPI() -STATIC_DIR=resource_path("static") - -app.mount("/static",StaticFiles(directory=STATIC_DIR), name="static") # --- 全局配置 --- log_queue: Optional[asyncio.Queue] = None @@ -69,8 +65,8 @@ class QueueAndHistoryHandler(logging.Handler): # --- 应用生命周期事件 --- -@app.on_event("startup") -async def startup_event(): +@asynccontextmanager +async def lifespan(app: FastAPI): global log_queue app.state.main_event_loop = asyncio.get_running_loop() log_queue = asyncio.Queue() @@ -94,7 +90,13 @@ async def startup_event(): break translater_logger.info("应用启动完成,日志队列/历史处理器已正确配置。") + yield +app = FastAPI(lifespan=lifespan) + +STATIC_DIR=resource_path("static") + +app.mount("/static",StaticFiles(directory=STATIC_DIR), name="static") # --- Background Task Logic --- async def _perform_translation(params: Dict[str, Any], file_contents: bytes, original_filename: str): @@ -403,7 +405,7 @@ async def download_html(filename_with_ext: str): headers={"Content-Disposition": f"attachment; filename*=UTF-8''{quote(actual_filename, safe='', encoding='utf-8')}"} ) - +#TODO:端口被占用时使用其他端口 def run_app(): print("正在启动 DocuTranslate WebUI") print("请访问 http://127.0.0.1:8010 (ctrl+点击链接即可打开)") diff --git a/docutranslate/converter/__init__.py b/docutranslate/converter/__init__.py index a631540..25cb957 100644 --- a/docutranslate/converter/__init__.py +++ b/docutranslate/converter/__init__.py @@ -4,3 +4,6 @@ from .converter_mineru import ConverterMineru from docutranslate.global_values import conditional_import if conditional_import("docling"): from .converter_docling import ConverterDocling + +# 打包docling时取消下面一行注释 +# from .converter_docling import ConverterDocling diff --git a/docutranslate/static/DocuTranslate.ico b/docutranslate/static/DocuTranslate.ico new file mode 100644 index 0000000000000000000000000000000000000000..b2acb245bf12637ce2fbc4770cfdc4f5a6a682a5 GIT binary patch literal 29369 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⋘NiH9Fqbf#ow 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 OLge2mNmof41^pkIo($Lk literal 0 HcmV?d00001 diff --git a/docutranslate/static/index.html b/docutranslate/static/index.html index e5c165d..1fb9ed9 100644 --- a/docutranslate/static/index.html +++ b/docutranslate/static/index.html @@ -4,6 +4,7 @@ DocuTranslate + @@ -321,9 +331,9 @@
- 文档转换引擎配置 + 文档解析引擎配置
- + @@ -363,7 +371,9 @@
@@ -393,7 +403,8 @@