修复编码问题、允许修改port

This commit is contained in:
xunbu
2025-07-04 19:15:21 +08:00
parent 13abf292a3
commit c3e7e0540f
6 changed files with 38 additions and 27 deletions

View File

@@ -113,12 +113,20 @@ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
- 第一次使用该库读取、翻译非markdown文本 - 第一次使用该库读取、翻译非markdown文本
- 第一次使用该库的公式识别或代码识别功能 - 第一次使用该库的公式识别或代码识别功能
## 使用图形化界面 ## 启动交互式界面
启动交互式界面
```commandline ```commandline
docutranslate -i docutranslate -i
``` ```
启动交互式界面并指定端口
```commandline
docutranslate -i -p 8011
```
## 翻译文件 ## 翻译文件
```python ```python
@@ -233,18 +241,22 @@ translater.translate_file(r"<要翻译的文件路径>",
# FAQ # FAQ
1. 是否支持扫描件 1. 8010端口被占用了怎么办
> 暂不支持 > 可以通过设置系统环境变量`DOCUTRANSLATE_PORT=<port>`来指定启动端口
2. 第一次使用很慢是怎么回事 2. 是否支持扫描件
> mineru解析引擎支持docling不支持
3. 第一次使用很慢是怎么回事
> 第一次是使用时docling需要从huggingface下载转换输入文件为markdown的模型 > 第一次是使用时docling需要从huggingface下载转换输入文件为markdown的模型
> 通过设置环境变量换源或科学上网可能有助于提高下载速度 > 通过设置环境变量换源或科学上网可能有助于提高下载速度
> huggingface换源请设置环境变量`HF_ENDPOINT=https://hf-mirror.com` > huggingface换源请设置环境变量`HF_ENDPOINT=https://hf-mirror.com`
3. 如何内网使用(不联网) 4如何内网使用(不联网)
> 可以对于docling提供的解析pdf、html等功能可以使用以下方式提前下载所需的模型 > 可以对于docling提供的解析pdf、html等功能可以使用以下方式提前下载所需的模型

View File

@@ -1,4 +1,4 @@
__version__="0.2.39" __version__="0.2.40"

View File

@@ -1,6 +1,7 @@
import asyncio import asyncio
import io import io
import logging import logging
import os
import socket import socket
import time import time
from contextlib import asynccontextmanager, closing from contextlib import asynccontextmanager, closing
@@ -482,8 +483,12 @@ def find_free_port(start_port):
port += 1 # 端口被占用,尝试下一个端口 port += 1 # 端口被占用,尝试下一个端口
def run_app(port=8010): def run_app(port:int|None=None):
if port:
initial_port = port initial_port = port
else:
env_port=os.environ.get("DOCUTRANSLATE_PORT")
initial_port=int(env_port) if env_port else 8010
try: try:
# 首先检查初始端口是否可用 # 首先检查初始端口是否可用
port = find_free_port(initial_port) port = find_free_port(initial_port)
@@ -491,6 +496,7 @@ def run_app(port=8010):
print(f"端口 {initial_port} 被占用,将使用端口 {port} 代替") print(f"端口 {initial_port} 被占用,将使用端口 {port} 代替")
print(f"正在启动 DocuTranslate WebUI 版本号:{__version__}") print(f"正在启动 DocuTranslate WebUI 版本号:{__version__}")
print(f"请用浏览器访问 http://127.0.0.1:{port} (部分终端可以使用ctrl+左键点击网址打开)") print(f"请用浏览器访问 http://127.0.0.1:{port} (部分终端可以使用ctrl+左键点击网址打开)")
print(f"可以设置环境变量`DOCUTRANSLATE_PORT=<port>`改变默认服务端口号")
uvicorn.run(app, host="127.0.0.1", port=port, workers=1) uvicorn.run(app, host="127.0.0.1", port=port, workers=1)
except Exception as e: except Exception as e:
print(f"启动失败: {e}") print(f"启动失败: {e}")

View File

@@ -16,7 +16,7 @@ def main():
parser.add_argument( parser.add_argument(
"-p", "--port", "-p", "--port",
type=int, # 指定参数类型(例如整数) type=int, # 指定参数类型(例如整数)
default=8010, # 默认值(可选) default=None, # 默认值(可选)
help="指定端口号默认8010" help="指定端口号默认8010"
) )
@@ -51,15 +51,8 @@ def main():
from docutranslate import __version__ from docutranslate import __version__
print(__version__) print(__version__)
else: else:
print("提示:若要启动 DocuTranslate 图形界面,请使用 -i 或 --interactive 选项。") parser.print_help()
print("\n用法示例:") sys.exit(1)
print(" docutranslate -i")
print(" docutranslate --interactive")
print("\n如需查看所有可用选项,请运行:")
print(" docutranslate --help")
# 或者直接显示帮助信息:
# parser.print_help()
sys.exit(1) # 以错误码退出,表明命令未按预期执行
if __name__ == "__main__": if __name__ == "__main__":

View File

@@ -301,7 +301,7 @@ class FileTranslater:
if embeded: if embeded:
output_dir.mkdir(parents=True, exist_ok=True) output_dir.mkdir(parents=True, exist_ok=True)
full_name = output_dir / filename.name full_name = output_dir / filename.name
with open(full_name, "w") as file: with open(full_name, "w", encoding="utf-8") as file:
file.write(self.export_to_markdown()) file.write(self.export_to_markdown())
translater_logger.info(f"文件已写入{full_name.resolve()}") translater_logger.info(f"文件已写入{full_name.resolve()}")
else: else:
@@ -336,7 +336,7 @@ class FileTranslater:
output_dir.mkdir(parents=True, exist_ok=True) output_dir.mkdir(parents=True, exist_ok=True)
full_name = output_dir / filename full_name = output_dir / filename
html_content = self.export_to_html(title=str(full_name.resolve().stem)) html_content = self.export_to_html(title=str(full_name.resolve().stem))
with open(full_name, "w") as file: with open(full_name, "w",encoding="utf-8") as file:
file.write(html_content) file.write(html_content)
translater_logger.info(f"文件已写入{full_name.resolve()}") translater_logger.info(f"文件已写入{full_name.resolve()}")
return self return self

View File

@@ -196,7 +196,7 @@ def unembed_base64_images_to_zip(markdown:str,markdown_name:str,image_folder_nam
f.write(base64.b64decode(b64data)) f.write(base64.b64decode(b64data))
return f"![{match.group(1)}]({url})" return f"![{match.group(1)}]({url})"
modified_md_content = re.sub(pattern, unembed_base64_images,markdown) modified_md_content = re.sub(pattern, unembed_base64_images,markdown)
with open(os.path.join(temp_dir,f"{markdown_name}"),"w") as f: with open(os.path.join(temp_dir,f"{markdown_name}"),"w",encoding="utf-8") as f:
f.write(modified_md_content) f.write(modified_md_content)
zip_buffer=io.BytesIO() zip_buffer=io.BytesIO()
folder_path=Path(temp_dir) folder_path=Path(temp_dir)