diff --git a/README.md b/README.md index 2494eaf..c7e81fe 100644 --- a/README.md +++ b/README.md @@ -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=`来指定启动端口 -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="", key="", model_id="", # 使用的模型id - convert_engin="docling", # 使用docling + convert_engin="docling", # 使用docling docling_artifact=r"C:\Users\\.cache\docling\models" ) ``` diff --git a/docutranslate/__init__.py b/docutranslate/__init__.py index e55f737..47fbe5c 100644 --- a/docutranslate/__init__.py +++ b/docutranslate/__init__.py @@ -1,4 +1,4 @@ -__version__="0.2.39" +__version__="0.2.40" diff --git a/docutranslate/app.py b/docutranslate/app.py index e2356f7..99812af 100644 --- a/docutranslate/app.py +++ b/docutranslate/app.py @@ -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=`改变默认服务端口号") uvicorn.run(app, host="127.0.0.1", port=port, workers=1) except Exception as e: print(f"启动失败: {e}") diff --git a/docutranslate/cli.py b/docutranslate/cli.py index d6c8098..d2e6553 100644 --- a/docutranslate/cli.py +++ b/docutranslate/cli.py @@ -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__": diff --git a/docutranslate/translater.py b/docutranslate/translater.py index 728c75a..03dbfc5 100644 --- a/docutranslate/translater.py +++ b/docutranslate/translater.py @@ -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 diff --git a/docutranslate/utils/markdown_utils.py b/docutranslate/utils/markdown_utils.py index 1d7d4cc..ff2e152 100644 --- a/docutranslate/utils/markdown_utils.py +++ b/docutranslate/utils/markdown_utils.py @@ -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)