Python 如何通过从底部(运行)到顶部(docDefaults)遍历来获取样式值?
TLDR:哪个优先级更高,或者,当我们想在Python 如何通过从底部(运行)到顶部(docDefaults)遍历来获取样式值?,python,ms-word,python-docx,Python,Ms Word,Python Docx,TLDR:哪个优先级更高,或者,当我们想在运行属性中查找值时,它返回无作为输出 示例:打印文档中所有运行的字体名称 doc=Document() 对于文件段落中的段落: 如果第1.2段: 对于磨合段运行: 打印(run.font.name) 问题: 目前,我正在编写一个用例,以检查给定文档是否具有特定的字体/语言/字体大小等 例如:为了获得整个文档的语言(拼写和语法)。目前,我按照以下步骤使用样式层次结构获取值: 加载文档 反复阅读段落 反复浏览段落 检查它的(当前运行)rPr是否为lang
运行
属性中查找值时,它返回无
作为输出
示例:打印文档中所有运行的字体名称
doc=Document()
对于文件段落中的段落:
如果第1.2段:
对于磨合段运行:
打印(run.font.name)
问题:
目前,我正在编写一个用例,以检查给定文档是否具有特定的字体/语言/字体大小等
例如:为了获得整个文档的语言(拼写和语法)。目前,我按照以下步骤使用样式层次结构获取值:
加载文档
反复阅读段落
反复浏览段落
检查它的(当前运行)rPr是否为lang
如果运行中没有值,则检查当前段落的rPr
,查看lang
如果段落中没有值,则从docDefaults rPr
如果在步骤4-6之间得到一个值,我会将该值视为Run值
这种方法帮助我获得了lang和font的预期结果(至少对于我所拥有的文档)
但是在某些情况下,docDefaults
本身没有价值,而且这种方法也没有帮助,我听说了
因此,如果当前样式没有值,我只实现了一个递归函数,从base\u样式
获取值
我在实现中做了一个小改动,因为每当rPr
中没有值时,我只需检查它的base\u样式的值,然后在层次结构中向上移动一步
我不确定我采用的方法是否正确。如果有一个简单的方法来实现这一点。请帮忙
我认为这里的最终答案只能可靠地来自一组测试用例,这些测试用例基于您可以开发的最小穷举组合集,每个测试用例“手工”确认它们的预期值
我之所以这样说,是因为尽管.docx格式的ISO规范非常好,但它通常避免指定行为,包括格式/样式继承层次结构的细节
你似乎在正确的轨道上,但我会把人物风格添加到你的候选人名单中。例如,运行可以应用显式字体,但也可以应用本身指定字体的字符样式。直接应用于运行的字体将获胜(根据“最近的说明符”原则),但这是一个有趣的问题,它将在运行级别/字符样式和直接应用的段落字体之间获胜。我敢打赌运行级角色样式,但这将是您将开发并最初手动验证的测试用例的主题
我将以下内容作为继承层次结构的草稿。在Word中进行实验时,您可以确认并填写位:
- 直接应用于运行的字符格式(
run.font
)
- 直接应用于运行的字符样式(
run.style
)
- 直接应用于段落的默认运行字符格式(
段落.font
注意:在python docx
中可能无法实现)
- 段落样式中明确指定的字符格式(
段落.style
)
- 按段落样式链接的字符样式(不确定,可能是
段落.style.character\u style
)
- 表格样式可能会影响某些事情,但可能不会影响
lang
。不确定这是否符合层次结构,这需要研究,可能还需要实验
- 默认段落样式(可能是
document.styles[“Normal”]
,但可能是可配置的,名称可能会随区域设置而变化,比如“Normale”可能是一些语言)
- 显式文档默认值
- Word内置默认值
不确定这是否完全回答了你的问题;如果你还需要其他东西,也许你可以澄清一下。谢谢你的精彩套餐和你的支持。我将添加所有缺少的层次结构并对其进行实验。任何想法,比如,我应该什么时候检查某个特定样式的base\u样式
,或者我可以简单地遵循这个层次结构?这是一个好问题,整个样式继承层次结构都被遍历以计算“有效样式”,所以我想说,您需要遍历base\u样式,直到到达死胡同为止(base_style是None
我想),然后再从样式开始。