【问题标题】:Extracting paragraph styles from a DOCX in Python3从 Python3 中的 DOCX 中提取段落样式
【发布时间】:2021-08-02 10:02:12
【问题描述】:

我一直在尝试在 Python3 中解决这个问题。

我通常使用 python-docx 库从 DOCX 文档中提取一些信息。

from docx.document import Document
from docx import Document

document = Document("test.docx")

for paragraph in document.paragraphs:
    for run in paragraph.runs:
        print(run.font.name)
        #returns None

所以,从上面的代码可以看出,这是一个非常简单的python-docx 代码,用于提取一些信息。我可以访问一些属性,例如; font namesizeoutline levels

但是,所有这些属性都返回None。因为它们没有被明确定义。

我已经检查过 StackOverflow 是否存在类似问题并找到了这些问题。

Extracting word document with styles associated to the content

How to get actual style of text in word document using python docx

在文档中,它还说,如果它返回None,那么它就是Default 样式,即被继承。

也尝试了一些 XML 解析,但无法达到所需的参数:

words = document._element.xpath('//w:r')
WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
PARA = WORD_NAMESPACE + 'p'

for elem in document.element.getiterator():
    if elem.tag == WORD_NAMESPACE + 'p':
       for i, child in enumerate(elem.getchildren()):
           if child.tag == WORD_NAMESPACE + 'pPr':
                ...
           # No idea how to access, all the styles with which 
           # tags etc.

我们如何也提取这些默认样式?我想从 DOCX 中提取缩进级别、粗体、斜体、字体名称、大小等属性。有什么替代方法。我想在 Python3 中解决它。

【问题讨论】:

    标签: python-3.x xml python-docx


    【解决方案1】:

    我相信你要发现的是有效样式,也就是说,在遍历了本次运行的样式层次之后,哪些字符格式对于这个特定的运行,属性有哪些可能的值。

    这是一个不平凡的问题。样式层次结构与层叠样式表 (CSS) 的工作方式类似,因为可以在不同级别设置格式属性,并且“最接近”的设置获胜。同时,运行可以没有指定的字符格式或样式,在这种情况下,“最远”或“最后的默认设置”决定了它的字符格式。

    为了计算有效的格式,您需要逐级遍历样式层次结构,直到找到您正在寻找的设置(例如font.name)。为此,您需要了解特定运行的样式层次结构,然后才能访问它的每个级别。

    所以这是一个很大的问题。粗略地说,只是给出一个想法,样式层次结构通常是:

    • 直接应用于运行的字符格式,例如粗体、斜体、字体名称和大小。
    • 使用字符样式应用字符格式
    • 使用附加到段落样式的字符样式应用字符格式。
    • 与默认段落样式关联的字符格式。
    • 指定的文档级默认值
    • 客户端内部的最终后备,客户端类似于 Word、OpenOffice 等。

    当文本出现在表格中并且表格样式可能适合该层次结构的某处时,存在例外情况。我希望还有其他人。

    目前python-docx 中没有对此的 API 支持,我还没有看到任何成功的实现。我不认为获得一个非常有用的实现是不可能的,只是很难让大多数人找到一些方法来避免它。

    【讨论】:

    • 感谢您的回答。我懂了。几年前我曾研究过一个非常相似的问题,当时我避免这样做。奇怪的是,在将近 4 年的时间里,什么都没有改变。
    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 2016-10-02
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多