如何使用 python-docx 检索段落对齐值?

问题描述 投票:0回答:1

我正在尝试使用 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

zip:https://drive.google.com/file/d/1L1TOdLP_RNDxddUqpkDHPNT55NGT7MCZ/view?usp=sharing

问题出在段落索引 = 11(文本 =“O Congresso Nacional decreta:”)。对于本段落,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 时,您应该继续检查对齐值。

python python-3.x python-docx
1个回答
0
投票

正如您所发现的,段落样式是任意深度的继承树(尽管深度超过三层可能不寻常)。实际上它会是一个森林,因为可以有多个“树”,但每种样式都只是一棵树的一部分。没有基本样式的样式是样式继承树的“根”。

为了确定格式属性的“有效”值,将从指定的样式向上遍历样式树。定义该属性的第一个样式节点决定其有效值。直接应用于段落的格式属性“胜过”任何样式。 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)

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

© www.soinside.com 2019 - 2024. All rights reserved.