Office OpenXML-WordprocessingML 解析(三):页眉和页脚

页眉和页脚指的是出现在 WordprocessingML(以下简称WML)文档每一页顶部或底部的文本、图形或数据(如页码、日期、文档标题等)。页眉出现在上边界(主文档上方),而页脚出现在页面的下边界(主文档下方)。如下所示:

image

因为 WML 是一种 基于流的格式(数据在节点之间流动),所以页眉和页脚的设定是通过指定文档节中所有页面的页眉页脚来实现的。也就是说,页眉页脚是和节关联的,页眉页脚会应用于节中的所有页面。

在文档的每一节中,最多可以有三种不同类型的页眉页脚:

  • 首页页眉/页脚
  • 奇数页页眉/页脚
  • 偶数页页眉/页脚

首页页眉和页脚指定了节的第一页独有的页眉或页脚;奇数页页眉和页脚指定了给定节中所有奇数页的页眉和页脚;偶数页页眉和页脚指定了给定节中所有偶数页的页眉和页脚。

1. 页眉

页眉由 Header 和 HeaderReference 两部分组成。

1.1 Header

Header 元素指定在 WordprocessingML(以下简称WML) 文档的一个或多个节中使用的单个页眉的内容。

该元素是页眉部件(HeaderPart)的根元素。在 Header 元素中,其内容类似正文中的内容。

示例:假设有如下所示带有一个页眉的文档:

image

该文档定义了一个文本内容为 “Header” 的页眉,那么此页眉在 WML 中的表示为:

<w:hdr>
	<w:p>
		<w:r>
			<w:t>Header</w:t>
		</w:r>
	</w:p>
</w:hdr>

1.2 HeaderReference

HeaderReference 元素指定与文档中的当前节关联的单个页眉。通过 id 属性引用该页眉,该属性指定与包中页眉部件之间的显式关系。

HeaderReference 元素在节属性(sectPr)中定义。在文档的每一节中,最多可以有三种不同类型的页眉:

public enum HeaderFooterValues
{
    // Even page header(偶数页页眉,偶数编号的页面)
    Even = 0,
	// Odd page header(奇数页页眉,也是默认页眉页脚类型)
    Default = 1,
    // First page header(首页页眉)
    First = 2
}

页眉类型由 type 属性指定。如果节中包含多个同一类型的页眉页脚,则认为该文档不符合标准。

示例:假设有如下带有不同的首页、偶数页、奇数页页眉的文档:

image

此文档定义了3个页眉,每一个在文档部件(DocumentPart)中都有一个唯一的 Relationship ID,如下所示:

image

<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    
    <Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header3.xml"/>
    
    <Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header2.xml"/>
    
    <Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header1.xml"/>
    ...
</Relationships>

然后,在节属性(sectPr)中使用以下 WML 引用这些页眉:

<w:sectPr>
    
  <w:headerReference w:type="even" r:id="rId6" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
    
  <w:headerReference w:type="default" r:id="rId7" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
    
  <w:headerReference w:type="first" r:id="rId8" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
    
  <w:titlePg />
  ...
</w:sectPr>

如果在节中未指定任一种页眉,则采用以下规则:

  • 如果未指定首页页眉(type 为 first 的 headerReference 元素),但指定了 titlePg(首页不同) 元素,则继承上一节的首页页眉;如果这是文档的第一节,则创建新的空白页眉。如果未指定 titlePg 元素,则不显示首页页眉,并在其位置使用奇数页页眉。
  • 如果未指定偶数页页眉(type 为 even 的 headerReference 元素),但在 settings 中指定了 evenAndOddHeaders(奇偶页不同)元素,则继承上一节的偶数页页眉;如果这是文档的第一节,则创建新的空白页眉。如果未指定 evenAndOddHeaders 元素,则不显示偶数页页眉,并在其位置使用奇数页页眉。
  • 如果未指定奇数页页眉(type 为 default 的 headerReference 元素),则从上一节继承奇数页页眉;如果这是文档的第一节,则创建新的空白页眉。

2. 页脚

页脚由 Footer 和 FooterReference 两部分组成。

Footer 元素指定在 WML 文档的一个或多个节中使用的单个页脚的内容。

该元素是页眉部件(FooterPart)的根元素。在 Footer 元素中,其内容类似正文中的内容。

示例:假设有如下所示带有一个页脚的文档:

image

该文档定义了一个文本内容为 “Footer” 的页眉,那么此页眉在 WML 中的表示为:

<w:ftr>
	<w:p>
		<w:r>
			<w:t>Footer</w:t>
		</w:r>
	</w:p>
</w:ftr>

2.2 FooterReference

FooterReference 元素指定与文档中的当前节关联的单个页脚。通过 id 属性引用该页眉,该属性指定与包中页脚部件之间的显式关系。

FooterReference 元素在节属性(sectPr)中定义。在文档的每一节中,最多可以有三种不同类型的页脚:

public enum HeaderFooterValues
{
    // Even page footer(偶数页页脚,页码为偶数的页面)
    Even = 0,
	// Odd page footer(奇数页页脚,也是默认页眉页脚类型)
    Default = 1,
    // First page footer(首页页脚)
    First = 2
}

页脚类型由 type 属性指定。如果节中包含多个同一类型的页眉页脚,则认为该文档不符合标准。

示例:假设有如下带有不同的首页、偶数页、奇数页页眉的文档:

image

此文档定义了3个页眉,每一个在文档部件(DocumentPart)中都有一个唯一的 Relationship ID,如下所示:

<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    
    <Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer1.xml"/>
    
    <Relationship Id="rId11" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer3.xml"/>
    
    <Relationship Id="rId9" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer2.xml"/>
    ...
</Relationships>

然后,在节属性(sectPr)中使用以下 WML 引用这些页脚:

<w:sectPr>
  <w:footerReference w:type="even" r:id="rId8" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
  <w:footerReference w:type="default" r:id="rId9" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
  <w:footerReference w:type="first" r:id="rId11" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
  <w:titlePg />
  ...
</w:sectPr>

如果未启用奇偶页不同,则默认页脚将同时出现在奇数和偶数编号的页面上。如果启用了,则对奇数页使用默认页脚。

如果在节中未指定任一种页脚,则采用以下规则:

  • 如果未指定首页页脚(type 为 first 的 footerReference 元素),但指定了 titlePg(首页不同) 元素,则继承上一节的首页页脚;如果这是文档的第一节,则创建新的空白页脚。如果未指定 titlePg 元素,则不显示首页页脚,并在其位置使用奇数页页脚。
  • 如果未指定偶数页页脚(type 为 even 的 footerReference 元素),但在 settings 中指定了 evenAndOddHeaders(奇偶页不同)元素,则继承上一节的偶数页页脚;如果这是文档的第一节,则创建新的空白页脚。如果未指定 evenAndOddHeaders 元素,则不显示偶数页页脚,并在其位置使用奇数页页脚。
  • 如果未指定奇数页页脚(type 为 default 的 footerReference 元素),则从上一节继承奇数页页脚;如果这是文档的第一节,则创建新的空白页脚。

3. EvenAndOddHeaders(奇偶页不同)

该元素指定了文档中所有节的奇数页和偶数页是否应该使用不同的页眉页脚。

在 Word 中,通过【页眉和页脚】的【奇偶页不同】选项来设置,如下所示:

image

在 WML 文档中,在 Settings 部件中指定,如下所示:

<w:settings>
  ...
  <w:evenAndOddHeaders />
  ...
</w:settings>

EvenAndOddHeaders 是一个全局元素,如果它的 val 属性设置为 true 或省略,那么文档中每一节的奇数页应该使用奇数页页眉页脚,偶数页应该使用偶数页页眉页脚(如果指定了页码,则页面的奇偶通过页码来判定,反之,通过实际的页面顺序来判定,文档第一页从1开始)。如果 EvenAndOddHeaders 的 val 为 false,那么节中所有的页面应该使用奇数页页眉页脚。

该设置不会影响每一节的首页页眉页脚的出现。如果设置了首页页眉页脚,那么随后的页面将应用此设置。

如果该元素的值为 false,但是设置了偶数页页眉页脚,那么偶数页页眉页脚会被忽略,显示的是奇数页页眉页脚。反之,如果该元素设置为true,且当前节中未设置奇数、偶数页页眉页脚,那么应该从前一节中继承奇数、偶数页页眉页脚。

如果未指定该元素,则表示其值为 false。

4. TitlePage(首页不同)

TitlePage 元素指定当前节的第一页是否应该使用不同的页眉页脚。

在 Word 中,通过【页眉和页脚】的【首页不同】选项来设置,如下所示:

image

在 WML 文档中,在节属性(sectPr)中指定,如下所示:

<w:sectPr>
  ...
  <w:titlePg />
  ...
</w:sectPr>

如果元素的val属性为true或忽略,那么当前节的第一页应该使用首页页眉页脚;反之,第一页应该根据页面编号来判断使用奇数页还是偶数页页眉页脚。

如果未指定此元素或者val属性值为false,并且定义了首页页眉,那么该页眉应该被忽略,显示的是奇数页页眉页脚。相反地,如果val属性值为true,并且在当前节中未指定首页页眉,那么应该继承前一节的首页页眉;如果当前节为文档第一节,那么应该创建一个空白的页眉页脚。

5. LinkToPrevious(链接到前一节)

对页眉或页脚使用【链接到前一节】功能可以指定当前节的页眉或页脚继承自前一节。应用该功能会删除在当前节中指定的页眉或页脚。取消该功能会在当前节中创建新的页眉或页脚,从而不再继承于前一节。

如果当前节是文档的第一节,则此操作无效。

在 Word 中,通过【页眉和页脚】的【链接到前一节】功能来设置,如下所示:

image

6. 页码

页码可以插在页眉,页脚以及页边距中。插入的页码一般是以形如 {PAGE \* MERGEFORMAT} 的域代码来表示。

6.1 页码格式(PageNumberType)

PageNumberType 元素指定当前节中所有页面的页码格式。

对于下图所示的页码格式,

image

对应的 WML 如下:

<w:sectPr>
	...
    <w:pgNumType w:fmt="lowerRoman" w:start="1" w:chapStyle="1" w:chapSep="enDash" />
	...
</w:sectPr>

Format(编号格式):指定了当前节中页码的编号格式;

Start(起始页码):指定了当前节第一页的页码编号。如果未指定该属性,那么编号从前一节的最大页码编号开始。

ChapterStyle(章节起始样式):指定页码中章节号对应标题的样式。章节号取自本页中最接近分节符的指定样式的段落编号。如果在当前节中没有指定的标题样式,或者样式没有编号,那么会使用前一节的章节号。如果节中标题没有指定编号,那么章节号和分隔符会被忽略。

ChapterSeparator(分隔符):指定章节号和页码之间的分隔符。

7. 参考

[1] ECMA-376-1:2016,Office Open XML File Formats — Fundamentals and Markup Language Reference,§17.10 Headers and Footers

[2] ECMA-376-1:2016,Office Open XML File Formats — Fundamentals and Markup Language Reference,§17.6.12 Page Numbering Settings

posted @ 2023-02-06 15:02  theyangfan  阅读(1291)  评论(1编辑  收藏  举报