Word 与排版

Word 里 bold 是 None,到底算不算加粗

直接格式的 None 表示未设置,不是 False。这里只检查直接格式与显式字符样式链;没有找到值时返回 None,留待段落样式、文档默认值和 OOXML toggle 规则进一步解析,不能称为完整有效样式计算器。

阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。 这篇先解决哪一个问题 直接格式的 None 表示未设置,不是 False。这里只检查直接格式与显式字符样式链;没有找到值时返回 None,留待段落样式、文档默认值和 OOXML toggle 规则进一步解析,不能称为完整有效样式计算器。 自包含的合成示例 依赖见导入列表。代码在内存中构造输入;运行记录单独提供,不代表对所有真实文件的保证。 from docx import Document from docx.enum.style import WD_STYLE_TYPE def partial_bold(run): if run.bold is not None: return run.bold style, seen = run.style, set() while style is not None and style.style_id not in seen: seen.add(style.style_id) if style.font.bold is not None: return style.font.bold style = style.base_style return None doc = Document() style = doc.styles.add_style("DemoBold", WD_STYLE_TYPE.CHARACTER) style.font.bold = True run = doc.add_paragraph().add_run("Example") run.style = style assert partial_bold(run) is True run.bold = False assert partial_bold(run) is False plain = doc.add_paragraph().add_run("Plain") assert partial_bold(plain) is None 理解样式继承的三态逻辑 如果用户在 Word 界面中选中一段文字并点击加粗按钮,XML 中会写入 <w:b/> ,此时 run.bold 为 True 。如果用户特意取消了某个本应加粗的样式效果,XML 中会写入 <w:b w:val="0"/> ,此时 run.bold 为 False 。但在绝大多数情况下,文本只是安静地躺在段落里,没有任何直接的加粗标签,它是否加粗完全取决于它所属的样式定义。这就是 None 的含义:它不是“否”,而是“请向上查找”。 这种设计是为了节省文件体积并保持格式的一致性。正如官方文档所述,内置样式(Built-in Styles)在未使用前甚至不会写入 styles.xml ,它们作为“Latent Styles(潜在样式)”存在于 Word 应用程序内部。这意味着你的代码必须具备回溯样式链的能力,而不能仅依赖 Run 对象本身的属性。 为了安全地判断文本是否真的加粗,我们需要编写一个递归函数来遍历样式继承链。 请注意:以下代码为已通过合成样本检查的教学演示示例,旨在展示三态判断逻辑,实际生产环境需处理循环引用保护、命名空间解析及更多属性类型。 验收标准与人工审查边界 自动化解析永远无法完美模拟 Word 的渲染引擎。在处理批量文档时,必须建立明确的验收矩阵,区分哪些情况可以信赖代码,哪些必须交给人工。 观察现象 代码返回值 实际渲染 处理决定 备注 Run.bold=None, Style.bold=True True 加粗 ✅ 自动通过 标准的样式继承场景 Run.bold=False, Style.bold=True False 常规 ✅ 自动通过 显式覆盖,代码逻辑正确 Run.bold=None, Style.bold=None False 加粗 ⚠️ 需人工复核 可能遗漏了 docDefaults 或主题字体设置 样式名为中文别名 AttributeError - ❌ 阻断并报错 python-docx 对本地化样式名支持不稳定 复杂列表项中的文本 True/False 不确定 ⚠️ 需人工复核 列表样式(List Style)与段落样式的交互极复杂 不适用范围声明: 此解析逻辑仅适用于标准的 .docx 格式。对于 .doc 转换而来的文件、受保护的文档、或使用宏动态修改格式的文档,代码解析结果可能与视觉呈现严重不符。此外,代码演示的是属性提取逻辑,而非端到端的排版还原;若目标是精确复刻版面,单纯依靠属性值是不够的。 参考资料与下一步 Understanding Styles - python-docx Documentation ECMA-376 Standard: Office Open XML File Formats 将这份检查清单用于文档翻译 Word 翻译容易把内容问题与格式问题混在一起。把样式、页眉和表格等检查项留到交付清单里,让审校知道该在哪里检查。 OmniDoc(产品入口) 提供多格式文档翻译入口,官网介绍了 OCR、术语表与双语对照功能。对希望直接从文件开始处理的团队,这是一条值得用实际样本评估的路径。请使用有权上传的脱敏文件,并用本篇的检查项复核结果;这里不声称 OmniDoc 使用了本文的开源库或内部算法,也不以示例代替产品性能测试。 - 1 -
更新于 2026-10-08