首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过从底部(run)遍历到顶部(docDefaults)来获得样式值?

如何通过从底部(run)遍历到顶部(docDefaults)来获得样式值?
EN

Stack Overflow用户
提问于 2020-09-23 15:45:27
回答 1查看 150关注 0票数 1

TLDR:,它具有更高的优先级风格继承风格层次,当我们希望在run属性中找到值时,它会将None作为输出返回。

示例:从文档中的所有运行中打印字体名称

代码语言:javascript
复制
doc = Document()
for para in doc.paragraphs:
    if para.text:
        for run in para.runs:
            print(run.font.name)

问题:

目前,我正在研究一个用例,以检查给定的文档是否具有特定的字体/语言/字体大小,等等.

例如:为了获得整个文档的语言(拼写和语法)。目前,我按照以下步骤使用Style Hierarchy获取值

  1. 加载文档
  2. 遍历段落
  3. 遍历段落的运行
  4. 检查它的(当前运行) rPr for lang
  5. 如果run中没有值,则检查当前rPrpara for lang
  6. 如果段中没有值,则从docDefaults rPr获取值。
  7. 如果在步骤4-6之间得到一个值,我将把该值视为run的值。

这种方法帮助我获得了朗和字体的预期结果(至少对于我所拥有的文档是如此)。

但是在某些情况下,docDefaults本身没有价值,这种方法也没有帮助,然后我听说了风格继承

因此,如果当前样式没有值,我只是实现了一个递归函数从base_style获取值。

我在我的实现中做了一个小的改变,因为每当没有来自rPr的值时,我只检查它的值是base_style,然后在层次结构中向上移动一步。

我不确定我所遵循的方法是否正确。如果有一个简单的方法来实现这一点。请帮帮忙。参考文献

上述步骤的源代码

EN

回答 1

Stack Overflow用户

发布于 2020-09-23 19:07:46

我认为,这里的最终答案只能可靠地来自一组测试用例,这些测试用例基于您可以开发的最低限度的详尽组合,每个测试用例都“手工”确认了它们的期望值。

我之所以这么说,是因为尽管.docx格式的ISO规范相当好,但它通常避免指定行为,包括格式/样式继承层次结构的细节。

你似乎走在正确的轨道上,但我会在你的候选人名单中添加角色风格。例如,运行可以应用显式字体,但也可以应用字符样式,该字符样式本身可以指定字体。直接应用于run的字体将获胜(根据“最近的说明”原则),但这是一个有趣的问题,它将在运行级别/字符风格和直接应用的段落字体之间获胜。我打赌运行级别的字符样式,但这将是测试用例的主题,您将开发并初步手工验证。

我认为以下是继承层次结构的草案。在Word中进行实验时,您可以确认并填写比特:

  • 直接应用于运行的字符格式设置(run.font)
  • 直接应用于运行的字符样式(run.style)
  • 直接应用于段落的默认运行字符格式设置(paragraph.font注释:可能无法在python-docx中实现)
  • 段落样式(paragraph.style)中显式指定的字符格式
  • 字符样式按段式链接(不确定,也许是paragraph.style.character_style)
  • 表样式可能会影响某些事情,但可能不会影响lang。不确定这是否符合等级制度,这将需要研究,可能也需要实验。
  • 默认的段落样式(可能是document.styles["Normal"],但可能是可配置的,名称可能因地区而异,比如"Normale“可能是某些语言)
  • 显式文档默认
  • Word内置默认

不确定这是否完全回答了你的问题;如果你需要其他的东西,也许你可以澄清它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64031644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档