导航

  • 索引
  • 下一页 |
  • 上一页 |
  • python-docx 1.0.1 文档 »
  • 分析 »
  • 页眉和页脚

页眉和页脚¶

在WordprocessingML文档中,页眉是与正文分开并显示在打印页顶部的文本。文档中的页眉在每一页之间通常是相同的,只是内容上有细微的差异,例如节标题或页码。这样的头也被称为运行头。

页脚在所有方面都类似于页眉,只是它显示在页面的底部。它不应与脚注混淆,因为脚注在页面之间并不一致。为了简洁起见,术语 header 在这里经常用来指可能是页眉或页脚对象的对象,相信读者能够理解它对这两种对象类型的适用性。

在书本印刷的文档中,页面在打开时双面打印,正面或 recto 每页的侧面显示在装订边的右侧和背面或 verso 每页的一侧显示在左侧。第一张打印页的页码为“1”,并且始终是直排页码。因为页是连续编号的,所以每个recto页都会收到一个 odd 页码,每个verso页都会收到一个 even 页码。

出现在矩形页上的页眉通常与反面页面上的标题不同。为了支持这种差异,可以选择使用与文档中默认的奇数页眉不同的偶数页眉。此“奇数和偶数标题”选项应用于文档级别,并影响文档的所有部分。

出现在章节(如章节)第一页的标题可能不同于后续页面的标题。支持这种差异会产生设置不同的首页页眉的选项。此“不同的首页页眉”选项应用于节级别,并且可能因文档中的节而异。

在WordprocessingML中,页眉或页脚出现在页边距区域内。除了少数例外,页眉或页脚可能包含可以出现在正文中的所有类型的内容,包括文本和图像。每个页眉和页脚都可以访问中定义的样式 /word/styles.xml .

每个节都有自己的页眉和页脚集,尽管可以将节配置为“继承”上一节的页眉和页脚。每个节可以有三个页眉定义:默认页眉、偶数页眉和第一页页眉。如果未启用不同的偶数/奇数页眉,则默认页眉将同时出现在偶数和奇数编号的页面上。如果启用了偶数/奇数页眉,则对奇数页使用默认页眉。一组对应的三个页脚定义也是可能的。所有页眉/页脚定义都是可选的。

开放式问题¶

  • 连续休息一下怎么样?页眉/页脚的行为是什么?

候选方案¶

每个部分都有一个标题;它从来没有:

>>> header = section.header
>>> header
<docx.hdrftr.Header object at 0x02468ACE>

上有三个标题属性 Section : .header , .even_page_header 和 .first_page_header . 所有头对象共享相同的属性和方法。页脚有三个对应的属性。

Header是的子类 BlockItemContainer ,从中继承与 Document ,如 .add_paragraph() .

如果 w:headerReference 标头的元素不存在,该标头的定义是从上一节“继承”的。此操作是递归的,例如,第一个部分的头定义可以应用于第三个部分。继承其定义的头称为“链接到上一个”。也许与直觉相反,第一节的标题可以“链接到上一节”,即使不存在前一节。这个 .is_linked_to_previous 属性只是测试当前节中是否存在头定义:

>>> header.is_linked_to_previous
True

编辑操作对源标头透明地进行操作,前一节中的源标头具有该类型的标头(当当前部分中不存在时)。如果前面的节没有标题,则在第一次构造性编辑调用时在文档的第一节中创建一个标题:

>>> header = document.sections[0].header
>>> header.is_linked_to_previous
True
>>> header.text = 'foobar'
>>> header.is_linked_to_previous
False

将False分配给 .is_linked_to_previous 当该节不存在时,为该节创建空白标题:

>>> header.is_linked_to_previous
True
>>> header.is_linked_to_previous = False
>>> header.is_linked_to_previous
False

相反,通过将True赋值给从节中删除现有的头 .is_linked_to_previous ::

>>> header.is_linked_to_previous
False
>>> header.is_linked_to_previous = True
>>> header.is_linked_to_previous
True

文档设置对象具有读/写功能 .odd_and_even_pages_header_footer 属性,该属性指示verso和recto页将具有不同的页眉。当 .odd_and_even_pages_header_footer 是假的;它们根本不是用语言表达的。分配 True 到 .odd_and_even_pages_header_footer 不会自动创建新的偶数标头定义::

>>> document.settings.odd_and_even_pages_header_footer
False
>>> document.settings.odd_and_even_pages_header_footer = True
>>> section.even_page_header.is_linked_to_previous
True

Section 具有读/写功能 .different_first_page_header_footer 属性,该属性指示节的第一页是否应具有不同的页眉。分配 True 到 .different_first_page_header_footer 不自动创建新的首页页眉定义:

>>> section.different_first_page_header_footer
False
>>> section.different_first_page_header_footer = True
>>> section.different_first_page_header_footer
True
>>> section.first_page_header.is_linked_to_previous
True

XML样本¶

标题有七种不同的排列:

文档所有页面的标题相同:

<w:sectPr>
    <w:headerReference w:type="default" r:id="rId3"/>
    ...
</w:sectPr>

只有一个奇怪的标题。这一部分与上面完全相同,但是 settings.xml 拥有 <w:evenAndOddHeaders> 属性:

<w:settings xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
   ...
   <w:evenAndOddHeaders w:val="1"/>
   ...
</w:settings>

不同的奇偶标题:

<w:sectPr>
    <w:headerReference w:type="default" r:id="rId3"/>
    <w:headerReference w:type="even" r:id="rId4"/>
    ...
</w:sectPr>

不同的第一页页眉,后面的页都有相同的页眉:

<w:sectPr>
    <w:headerReference w:type="default" r:id="rId3"/>
    <w:headerReference w:type="first" r:id="rId4"/>
    <w:titlePg/>
    ...
</w:sectPr>

不同的第一、偶数和奇数页眉:

<w:sectPr>
    <w:headerReference w:type="default" r:id="rId3"/>
    <w:headerReference w:type="first" r:id="rId4"/>
    <w:headerReference w:type="even" r:id="rId5"/>
    <w:titlePg/>
    ...
</w:sectPr>

标题部分:

<w:hdr>
  <w:p>
    <w:pPr>
      <w:pStyle w:val="Header"/>
    </w:pPr>
    <w:r>
      <w:t>Header for section-1</w:t>
    </w:r>
  </w:p>
</w:hdr>

言语行为¶

  • 关闭偶数/奇数标题时,Word将设置 w:evenAndOddHeaders 设置为0,但实际上不删除偶数标头。

  • 关闭第一页页眉时,Word会设置 w:titlePg 设置为0,但实际上不删除偶数标头。

  • Word将加载具有偶数页眉但没有奇数页眉的文件。

微软API¶

WdHeaderFooterIndex枚举::

EVEN_PAGES = 3
FIRST_PAGE = 2
PRIMARY    = 1

在MS API中创建页脚:

section = Document.Sections(1)
footers = section.Footers  # a HeadersFooters collection object
default_footer = footers(wdHeaderFooterPrimary)
default_footer.Range.Text = "Footer text"

PageSetup对象:

DifferentFirstPageHeaderFooter: Read/write {True, False, WD_UNDEFINED}
OddAndEvenPagesHeaderFooter: Read/write {True, False, WD_UNDEFINED}

架构摘要¶

<xsd:complexType name="CT_SectPr">  <!-- denormalized -->
  <xsd:sequence>
    <xsd:choice minOccurs="0" maxOccurs="6"/>
      <xsd:element name="headerReference" type="CT_HdrFtrRef"/>
      <xsd:element name="footerReference" type="CT_HdrFtrRef"/>
    </xsd:choice>
    <xsd:element name="footnotePr"      type="CT_FtnProps"      minOccurs="0"/>
    <xsd:element name="endnotePr"       type="CT_EdnProps"      minOccurs="0"/>
    <xsd:element name="type"            type="CT_SectType"      minOccurs="0"/>
    <xsd:element name="pgSz"            type="CT_PageSz"        minOccurs="0"/>
    <xsd:element name="pgMar"           type="CT_PageMar"       minOccurs="0"/>
    <xsd:element name="paperSrc"        type="CT_PaperSource"   minOccurs="0"/>
    <xsd:element name="pgBorders"       type="CT_PageBorders"   minOccurs="0"/>
    <xsd:element name="lnNumType"       type="CT_LineNumber"    minOccurs="0"/>
    <xsd:element name="pgNumType"       type="CT_PageNumber"    minOccurs="0"/>
    <xsd:element name="cols"            type="CT_Columns"       minOccurs="0"/>
    <xsd:element name="formProt"        type="CT_OnOff"         minOccurs="0"/>
    <xsd:element name="vAlign"          type="CT_VerticalJc"    minOccurs="0"/>
    <xsd:element name="noEndnote"       type="CT_OnOff"         minOccurs="0"/>
    <xsd:element name="titlePg"         type="CT_OnOff"         minOccurs="0"/>
    <xsd:element name="textDirection"   type="CT_TextDirection" minOccurs="0"/>
    <xsd:element name="bidi"            type="CT_OnOff"         minOccurs="0"/>
    <xsd:element name="rtlGutter"       type="CT_OnOff"         minOccurs="0"/>
    <xsd:element name="docGrid"         type="CT_DocGrid"       minOccurs="0"/>
    <xsd:element name="printerSettings" type="CT_Rel"           minOccurs="0"/>
    <xsd:element name="sectPrChange"    type="CT_SectPrChange"  minOccurs="0"/>
  </xsd:sequence>
  <xsd:attribute name="rsidRPr"  type="ST_LongHexNumber"/>
  <xsd:attribute name="rsidDel"  type="ST_LongHexNumber"/>
  <xsd:attribute name="rsidR"    type="ST_LongHexNumber"/>
  <xsd:attribute name="rsidSect" type="ST_LongHexNumber"/>
</xsd:complexType>

<xsd:complexType name="CT_HdrFtrRef">
  <xsd:attribute ref="r:id" use="required"/>
  <xsd:attribute name="type" type="ST_HdrFtr" use="required"/>
</xsd:complexType>

<xsd:simpleType name="ST_HdrFtr">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="even"/>
    <xsd:enumeration value="default"/>
    <xsd:enumeration value="first"/>
  </xsd:restriction>
</xsd:simpleType>

目录

  • 页眉和页脚
    • 开放式问题
    • 候选方案
    • XML样本
    • 言语行为
    • 微软API
    • 架构摘要

上一主题

分析

下一主题

设置部件

Useful Links

  • python-docx @ GitHub
  • python-docx @ PyPI
  • Issue Tracker

快速搜索

导航

  • 索引
  • 下一页 |
  • 上一页 |
  • python-docx 1.0.1 文档 »
  • 分析 »
  • 页眉和页脚
© Copyright 2013, Steve Canny. Created using Sphinx 6.2.1.
Theme based on Read The Docs