From decc7e7791fa9ae2e7908ccf29147981500c2155 Mon Sep 17 00:00:00 2001 From: xunbu Date: Wed, 8 Oct 2025 12:53:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A1=B5=E7=9C=89=E9=A1=B5?= =?UTF-8?q?=E8=84=9A=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai_translator/docx_translator.py | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/docutranslate/translator/ai_translator/docx_translator.py b/docutranslate/translator/ai_translator/docx_translator.py index 2c50d12..9f92b7b 100644 --- a/docutranslate/translator/ai_translator/docx_translator.py +++ b/docutranslate/translator/ai_translator/docx_translator.py @@ -63,6 +63,7 @@ class DocxTranslator(AiTranslator): def _pre_translate(self, document: Document) -> Tuple[DocumentObject, List[Dict[str, Any]], List[str]]: """ [已重构] 预处理 .docx 文件,在 Run 级别上提取文本,以避免破坏图片。 + 此版本增加了对页眉和页脚的翻译支持。 :param document: 包含 .docx 文件内容的 Document 对象。 :return: 一个元组,包含: - docx.Document 对象 @@ -97,16 +98,29 @@ class DocxTranslator(AiTranslator): elements_to_translate.append({"type": "text_runs", "runs": current_runs}) original_texts.append(current_text_segment) - # 遍历所有段落 - for para in doc.paragraphs: - process_paragraph(para) + def process_container(container): + """处理给定容器(如文档、页眉、单元格)中的段落和表格。""" + # 遍历容器中的所有段落 + for para in container.paragraphs: + process_paragraph(para) + # 遍历容器中的所有表格 + for table in container.tables: + for row in table.rows: + for cell in row.cells: + # 单元格本身也是一个容器,我们直接处理其段落。 + for cell_para in cell.paragraphs: + process_paragraph(cell_para) - # 遍历所有表格 - for table in doc.tables: - for row in table.rows: - for cell in row.cells: - for para in cell.paragraphs: - process_paragraph(para) + # 1. 翻译文档主体 + process_container(doc) + + # 2. 翻译所有节的页眉和页脚 + for section in doc.sections: + # 每个节可以有多达三种不同的页眉和页脚(第一页、偶数页、默认页) + for header in (section.header, section.first_page_header, section.even_page_header): + process_container(header) + for footer in (section.footer, section.first_page_footer, section.even_page_footer): + process_container(footer) return doc, elements_to_translate, original_texts @@ -205,4 +219,4 @@ class DocxTranslator(AiTranslator): # 将翻译结果写回文档 document.content = await asyncio.to_thread(self._after_translate, doc, elements_to_translate, translated_texts, original_texts) - return self + return self \ No newline at end of file