修复编码问题、允许修改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文本
- 第一次使用该库的公式识别或代码识别功能
## 使用图形化界面
## 启动交互式界面
启动交互式界面
```commandline
docutranslate -i
```
启动交互式界面并指定端口
```commandline
docutranslate -i -p 8011
```
## 翻译文件
```python
@@ -170,12 +178,12 @@ translater = FileTranslater(convert_engin="mineru", # 使用mineru解析文档
# convert_engin="docling" # 使用docling解析文档
)
# 文件转html
translater.read_file("<文件路径>").save_as_html()#保存
translater.read_file("<文件路径>").export_to_html()#输出字符串
translater.read_file("<文件路径>").save_as_html() # 保存
translater.read_file("<文件路径>").export_to_html() # 输出字符串
# 文件转markdown
translater.read_file("<文件路径>").save_as_markdown()#保存内嵌bas64图片的markdown
translater.read_file("<文件路径>").save_as_markdown(embed=False)#保存不内嵌图片的markdown文件夹形式
translater.read_file("<文件路径>").export_to_markdown()#输出内嵌图片的markdown字符串
translater.read_file("<文件路径>").save_as_markdown() # 保存内嵌bas64图片的markdown
translater.read_file("<文件路径>").save_as_markdown(embed=False) # 保存不内嵌图片的markdown文件夹形式
translater.read_file("<文件路径>").export_to_markdown() # 输出内嵌图片的markdown字符串
```
## 参数说明
@@ -233,18 +241,22 @@ translater.translate_file(r"<要翻译的文件路径>",
# FAQ
1. 是否支持扫描件
1. 8010端口被占用了怎么办
> 暂不支持
> 可以通过设置系统环境变量`DOCUTRANSLATE_PORT=<port>`来指定启动端口
2. 第一次使用很慢是怎么回事
2. 是否支持扫描件
> mineru解析引擎支持docling不支持
3. 第一次使用很慢是怎么回事
> 第一次是使用时docling需要从huggingface下载转换输入文件为markdown的模型
> 通过设置环境变量换源或科学上网可能有助于提高下载速度
> huggingface换源请设置环境变量`HF_ENDPOINT=https://hf-mirror.com`
3. 如何内网使用(不联网)
4如何内网使用(不联网)
> 可以对于docling提供的解析pdf、html等功能可以使用以下方式提前下载所需的模型
@@ -263,7 +275,7 @@ from docutranslate import FileTranslater
translater = FileTranslater(base_url="<baseurl>",
key="<key>",
model_id="<model-id>", # 使用的模型id
convert_engin="docling", # 使用docling
convert_engin="docling", # 使用docling
docling_artifact=r"C:\Users\<user>\.cache\docling\models"
)
```

View File

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

View File

@@ -1,6 +1,7 @@
import asyncio
import io
import logging
import os
import socket
import time
from contextlib import asynccontextmanager, closing
@@ -482,8 +483,12 @@ def find_free_port(start_port):
port += 1 # 端口被占用,尝试下一个端口
def run_app(port=8010):
initial_port = port
def run_app(port:int|None=None):
if port:
initial_port = port
else:
env_port=os.environ.get("DOCUTRANSLATE_PORT")
initial_port=int(env_port) if env_port else 8010
try:
# 首先检查初始端口是否可用
port = find_free_port(initial_port)
@@ -491,6 +496,7 @@ def run_app(port=8010):
print(f"端口 {initial_port} 被占用,将使用端口 {port} 代替")
print(f"正在启动 DocuTranslate WebUI 版本号:{__version__}")
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)
except Exception as e:
print(f"启动失败: {e}")

View File

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

View File

@@ -301,7 +301,7 @@ class FileTranslater:
if embeded:
output_dir.mkdir(parents=True, exist_ok=True)
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())
translater_logger.info(f"文件已写入{full_name.resolve()}")
else:
@@ -336,7 +336,7 @@ class FileTranslater:
output_dir.mkdir(parents=True, exist_ok=True)
full_name = output_dir / filename
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)
translater_logger.info(f"文件已写入{full_name.resolve()}")
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))
return f"![{match.group(1)}]({url})"
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)
zip_buffer=io.BytesIO()
folder_path=Path(temp_dir)