From 4ef548120ba539aa2ea40b982e1e7325bf7fedbf Mon Sep 17 00:00:00 2001 From: xunbu Date: Sun, 19 Oct 2025 15:08:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96docx=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai_translator/docx_translator.py | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/docutranslate/translator/ai_translator/docx_translator.py b/docutranslate/translator/ai_translator/docx_translator.py index 8b77cf8..c78257b 100644 --- a/docutranslate/translator/ai_translator/docx_translator.py +++ b/docutranslate/translator/ai_translator/docx_translator.py @@ -82,6 +82,11 @@ class DocxTranslator(AiTranslator): 一个基于高级结构化解析的 .docx 文件翻译器。 它能高精度保留样式,并正确处理正文、表格、页眉/脚、脚注/尾注、超链接和目录(TOC)等复杂元素。 + [v6.4 - 形状文本翻译] + - 新增对形状(Shapes)内文本的提取与翻译支持。现在可以正确翻译标注、流程图等图形元素中的文字。 + - 改进了核心遍历逻辑,使其能够深入 元素,解析内部的 (文本框内容), + 同时保持对无文本的普通图片的原有处理方式,实现鲁棒性和兼容性。 + [v6.3 - 上下文感知格式切分] - 根本性地改进了文本切分逻辑,解决了因带格式的空格(如下划线空格)导致连续短语被错误拆分的问题。 - 新逻辑不再将任何带格式的空格视为固定的边界,而是通过比较相邻文本片段的“显著格式”是否一致来决定是否合并。 @@ -145,7 +150,9 @@ class DocxTranslator(AiTranslator): # ---------------------- 修改结束 ---------------------- - def _process_element_children(self, element, elements: List[Dict[str, Any]], texts: List[str], + # ---------- 代码修改部分 1: 形状翻译逻辑的核心实现 ---------- + def _process_element_children(self, element, parent_paragraph: Paragraph, elements: List[Dict[str, Any]], + texts: List[str], state: Dict[str, Any]): def flush_segment(): @@ -164,7 +171,7 @@ class DocxTranslator(AiTranslator): if child.tag in self.RECURSIVE_CONTAINER_TAGS: flush_segment() - self._process_element_children(child, elements, texts, state) + self._process_element_children(child, parent_paragraph, elements, texts, state) flush_segment() # 在递归容器后也刷新,确保其内容成为独立片段 continue @@ -176,37 +183,49 @@ class DocxTranslator(AiTranslator): continue if isinstance(child, CT_R): - run = Run(child, None) + # 传入 parent_paragraph 以确保 Run 对象具有正确的上下文 + run = Run(child, parent_paragraph) - # ---------- 新增修改部分 3: 重构核心切分逻辑 ---------- - # 步骤 1: 检查绝对边界(图片、制表符等),它们总是会结束当前的片段。 + # 新增逻辑:处理形状(drawing/pict)内的文本 + # 形状可以包含文本框,需要优先于图片处理逻辑进行解析 + if '