修复编码问题、允许修改port
This commit is contained in:
34
README.md
34
README.md
@@ -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
|
||||||
@@ -170,12 +178,12 @@ translater = FileTranslater(convert_engin="mineru", # 使用mineru解析文档
|
|||||||
# convert_engin="docling" # 使用docling解析文档
|
# convert_engin="docling" # 使用docling解析文档
|
||||||
)
|
)
|
||||||
# 文件转html
|
# 文件转html
|
||||||
translater.read_file("<文件路径>").save_as_html()#保存
|
translater.read_file("<文件路径>").save_as_html() # 保存
|
||||||
translater.read_file("<文件路径>").export_to_html()#输出字符串
|
translater.read_file("<文件路径>").export_to_html() # 输出字符串
|
||||||
# 文件转markdown
|
# 文件转markdown
|
||||||
translater.read_file("<文件路径>").save_as_markdown()#保存内嵌bas64图片的markdown
|
translater.read_file("<文件路径>").save_as_markdown() # 保存内嵌bas64图片的markdown
|
||||||
translater.read_file("<文件路径>").save_as_markdown(embed=False)#保存不内嵌图片的markdown(文件夹形式)
|
translater.read_file("<文件路径>").save_as_markdown(embed=False) # 保存不内嵌图片的markdown(文件夹形式)
|
||||||
translater.read_file("<文件路径>").export_to_markdown()#输出内嵌图片的markdown字符串
|
translater.read_file("<文件路径>").export_to_markdown() # 输出内嵌图片的markdown字符串
|
||||||
```
|
```
|
||||||
|
|
||||||
## 参数说明
|
## 参数说明
|
||||||
@@ -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等功能,可以使用以下方式提前下载所需的模型
|
||||||
|
|
||||||
@@ -263,7 +275,7 @@ from docutranslate import FileTranslater
|
|||||||
translater = FileTranslater(base_url="<baseurl>",
|
translater = FileTranslater(base_url="<baseurl>",
|
||||||
key="<key>",
|
key="<key>",
|
||||||
model_id="<model-id>", # 使用的模型id
|
model_id="<model-id>", # 使用的模型id
|
||||||
convert_engin="docling", # 使用docling
|
convert_engin="docling", # 使用docling
|
||||||
docling_artifact=r"C:\Users\<user>\.cache\docling\models"
|
docling_artifact=r"C:\Users\<user>\.cache\docling\models"
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
__version__="0.2.39"
|
__version__="0.2.40"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
initial_port = port
|
if 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}")
|
||||||
|
|||||||
@@ -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__":
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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""
|
return f""
|
||||||
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user