使用页眉和页脚
Word 支持页眉和页脚。页眉是出现在每页顶部区域的文本,与正文分开,通常传达上下文信息,例如文档标题,作者,创建日期或页码。文档中的页眉在页面之间是相同的,只是内容上的差别很小,例如节标题或页码的变化。页眉也称为 运行头。
页脚在所有方面都类似于页眉,只不过它出现在页面底部。不应将其与脚注混淆,脚注在页面之间并不统一。为简便起见,此处经常使用页眉一词来指代页眉或页脚对象,以使读者能够理解其对两种对象类型的适用性。
访问 节(section)的页眉
页眉和页脚链接到一个节;这允许每个节具有不同的页眉和/或页脚。例如,横向节的页眉可能比纵向节的页眉宽。
每个节对象都有一个 .header 属性,可用于访问该节的 _Header 对象:
document = Document()
section = document.sections[0]
header = section.header
header
# <docx.section._Header object at 0x...>
_Header 对象始终存在于 Section.header 上,即使没有为该节定义页眉也是如此。 _Header.is_linked_to_previous 表示是否存在实际的页眉定义:
header.is_linked_to_previous
# True
值为 True 表示 _Header 对象不包含页眉定义,并且该节将显示与上一节相同的页眉。这种 “继承” 行为是递归的,因此 “链接的” 页眉实际上是从具有页眉定义的第一个先前节中获得其定义的。在 Word UI 中,此 “链接” 状态指示为 “与先前相同”。
新文档没有页眉(在包含的单个节上),因此在这种情况下 .is_linked_to_previous 为 True。请注意,这种情况可能有点违反直觉,因为没有先前的页眉可链接。在这种“没有上一个页眉”的情况下,不显示任何页眉。
添加页眉(简单情况)
只需编辑 _Header 对象的内容,即可将页眉添加到新文档中。_Header 对象是“情节”容器,其内容就像 Document 对象一样被编辑。请注意,像新文档一样,新页眉已经包含一个(空)段落:
paragraph = header.paragraphs[0]
paragraph.text = "文档标题"
还要注意,添加内容(甚至只是访问 header.paragraphs )的行为添加了页眉定义并更改了 .is_linked_to_previous 的状态:
header.is_linked_to_previous
# False
添加“分区”页眉内容
具有多个“区域”的页眉通常是使用精心放置的制表位来完成的。
居中和右对齐“区域”所需的制表位是Word中页眉和页脚样式的一部分。如果您使用的是自定义模板而不是 python-docx 的默认模板,则在模板中定义该样式可能很有意义。
插入的制表符(“ \ t”)用于分隔左,中和右对齐的页眉内容:
paragraph = header.paragraphs[0]
paragraph.text = "左对齐文本\t居中文本\t右对齐文本"
paragraph.style = document.styles["Header"]
Header 样式会自动应用到新的页眉,因此在这种情况下,不需要上面的第三行(应用 Header 样式),但在此处包含了此行以说明一般情况。
移除页眉
可以通过将 True 分配给它的 .is_linked_to_previous 属性来删除不需要的页眉:
header.is_linked_to_previous = True
header.is_linked_to_previous
# True
当将 True 分配给 .is_linked_to_previous 时,标题的内容将不可撤消地删除。
了解多节(section)文档中的页眉
“刚开始编辑”方法在简单情况下效果很好,但是要弄清多节文档中的页眉行为,一些简单的概念会有所帮助。
- 每个节都可以有自己的页眉定义(但不必如此)。
- 缺少页眉定义的节将继承前节的页眉。 _Header.is_linked_to_previous 属性仅反映页眉定义的存在;存在定义时为 False,否则显示为 True。
- 缺少页眉定义是默认状态。新文档没有定义的页眉,新插入的节也没有。 .is_linked_to_previous 属性在这两种情况下均为True。
- 如果 _Header 对象具有页眉定义,则其内容为其自身的内容。否则,其内容为第一先前节定义的页眉内容。如果没有节具有页眉定义,则在第一个节上添加一个新的页眉定义,其他所有节都继承该页眉定义。页眉定义的这种添加发生在第一次访问页眉内容时,可能是通过引用 header.paragraphs 来实现的。
添加页眉定义(一般情况)
通过将 False 分配给 .is_linked_to_previous 属性,可以为缺少页眉的节提供显式的页眉定义:
header.is_linked_to_previous
# True
header.is_linked_to_previous = False
header.is_linked_to_previous
# False
新添加的页眉定义包含一个空的段落。请注意,以这种方式离开页眉有时会很有用,因为它可以有效地“关闭”该节以及随后的节的页眉,直到下一个具有已定义页眉的节。
为已经具有页眉定义的页眉上的 .is_linked_to_previous 分配 False 不会执行任何操作。
自动定位继承内容
如果存在任何“继承”关系,则编辑页眉的内容会编辑源页眉的内容。因此,例如,如果第2节页眉从第1节继承而编辑第2节页眉,则实际上是在更改第1节页眉的内容。除非首先为它的 .is_linked_to_previous 属性显式分配 False,否则不会为第2节添加新的页眉定义。