如何使用python-docx获取段落对齐值?

r7xajy2e  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(130)

我正在尝试使用python-docx自动化docx文件的格式。我想得到段落对齐的值。我的代码适用于大多数段落,但我正在测试的docx文件中有一个段落被对齐为“justify”,但我无法通过代码获得此信息。

for paragraph in doc.paragraphs:
a1 = paragraph.alignment
a2 = paragraph.style.paragraph_format.alignment
a3 = paragraph.style.base_style.paragraph_format.alignment

上面的代码适用于大多数情况,但不是所有情况。有没有其他地方可以存储这些信息?
如果有人想访问测试文件:docx:https://docs.google.com/document/d/1PG4eZGWvDG9shhAB7xPPkpjFjiO2W9PW/edit?usp=sharing&ouid=108709886188812681637&rtpof=true&sd=true
邮编:https://drive.google.com/file/d/1L1TOdLP_RNDxddUqpkDHPNT55NGT7MCZ/view?usp=sharing
问题出在第11段(text =“OCongresso Nacionaldecreta:“)。对于这一段,a1,a2和a3都等于“无”,尽管这一段在视觉上被格式化为“justify”。
感谢您的任何帮助!
编辑:我将在这里添加解决方案,以防有人面临同样的问题。对齐值可以存储在以下任何位置:

paragraph.alignment
paragraph.style.paragraph_format.alignment
paragraph.style.base_style.paragraph_format.alignment
paragraph.style.base_style.base_style.paragraph_format.alignment
paragraph.style.base_style.base_style.base_style.paragraph_format.alignment

换句话说,一个样式可以从另一个样式继承。这种固有性可以是只要一个人想要的。因此,当paragraph.style.base_style不为None时,您应该继续检查对齐值。

koaltpgm

koaltpgm1#

正如您所发现的,段落样式是一个任意深度的 * 继承树 *(尽管超过三级深度可能不常见)。实际上,它将是一个 * 森林 *,因为可以有多个“树”,但每一个风格是只有一个树的一部分。没有基样式的样式是样式继承树的“根”。
要确定格式属性的 effective 值,将从指定的样式向上遍历样式树。定义该属性的第一个样式节点确定其有效值。直接应用于段落的格式属性“胜过”任何样式。

from docx.enum.text import WD_ALIGN_PARAGRAPH

alignment = effective_alignment(paragraph)

def effective_alignment(paragraph: Paragraph) -> WD_ALIGN_PARAGRAPH | None:
    alignment = paragraph.paragraph_format.alignment
    if alignment is not None:
        return alignment
    return effective_style_alignment(paragraph.style)

def effective_style_alignment(style: ParagraphStyle) -> WD_ALIGN_PARAGRAPH | None:
    """Recursively navigate up style hierarchy to find alignment."""
    alignment = style.paragraph_format.alignment
    if alignment is not None:
        return alignment
    base_style = style.base_style
    if base_style is None:
        return None
    return effective_style_alignment(base_style)

这里的递归方法避免了猜测给定文档中继承的深度。

相关问题