使用Python为Word文档添加自定义页码
作者:SunnyDays1011
本文介绍如何使用 Python 为 Word DOC 或 DOCX 文档添加和自定义页码,包括普通连续页码、“第 X 页,共 Y 页”、首页不显示页码、指定起始页码以及分节编号等多种常见场景。

在 Word 中添加页码看起来很简单,但当文档包含封面、多个节,或者不同部分需要采用不同的页码规则时,设置起来就会复杂不少。
普通报告可能只需要在页脚居中显示 1、2、3……。而论文、技术文档等往往有更复杂的要求,例如前置部分使用罗马数字,正文重新从第 1 页开始编号,或者标题页不显示页码。
如果只处理一个文档,在 Microsoft Word 中手动插入页码并不麻烦。但对于通过模板自动生成的文档,或者需要批量处理大量 Word 文件的场景,使用 Python 设置页码会更加高效。
本文将介绍以下内容:
- 添加普通页码
- 添加“第 X 页,共 Y 页”格式的页码
- 隐藏首页页码
- 从指定数字开始编号
- 在新的节中重新开始页码编号
- 为不同节使用不同的页码格式
- 仅为指定节添加页码
安装所需的 Python Word 库
本文使用 Spire.Doc for Python 操作 Word 文档。它提供了处理节、页眉页脚、域以及页码设置等内容的相关 API。
可以通过 PyPI 安装:
pip install Spire.Doc
使用 Python 为 Word 添加普通页码
对于 1、2、3…… 这类常规连续页码,可以在文档页脚中添加 PAGE 域。
下面的示例遍历文档中的所有节,并在每一节的页脚中添加居中的页码:
from spire.doc import *
from spire.doc.common import *
# 加载 Word 文档
document = Document()
document.LoadFromFile("input.docx")
# 为每一节的页脚添加页码
for i in range(document.Sections.Count):
section = document.Sections[i]
# 获取页脚
footer = section.HeadersFooters.Footer
# 添加居中段落
paragraph = footer.AddParagraph()
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
# 添加当前页码
paragraph.AppendField(
"页码",
FieldType.FieldPage
)
# 保存结果
document.SaveToFile(
"add-page-numbers.docx",
FileFormat.Docx2016
)
document.Close()
FieldType.FieldPage 表示 Word 中的当前页码。
本例将页码设置为页脚居中显示。如果需要,可以将 HorizontalAlignment.Center 改为 Left 或 Right,使页码左对齐或右对齐。
使用 Python 为 Word 添加“第 X 页,共 Y 页”格式的页码
对于报告、手册、方案等页数较多或需要打印的文档,仅显示当前页码有时不够直观。而使用:
第 3 页,共 12 页
这种格式可以同时告诉读者当前所在页面以及文档总页数。
要实现这一效果,可以组合使用 PAGE 和 NUMPAGES 两个域。其中,PAGE 返回当前页码,NUMPAGES 返回整个文档的总页数。
from spire.doc import *
from spire.doc.common import *
# 加载 Word 文档
document = Document()
document.LoadFromFile("input.docx")
# 为每一节添加“第 X 页,共 Y 页”
for i in range(document.Sections.Count):
section = document.Sections[i]
# 获取页脚
footer = section.HeadersFooters.Footer
# 在页脚中添加居中段落
paragraph = footer.AddParagraph()
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
# 添加“第 X 页,共 Y 页”
paragraph.AppendText("第 ")
paragraph.AppendField(
"当前页",
FieldType.FieldPage
)
paragraph.AppendText(" 页,共 ")
paragraph.AppendField(
"总页数",
FieldType.FieldNumPages
)
paragraph.AppendText(" 页")
# 保存结果
document.SaveToFile(
"page-x-of-y.docx",
FileFormat.Docx2016
)
document.Close()
由于当前页码和总页数都是 Word 域,而不是在 Python 中写死的数字,因此 Word 可以根据文档的实际分页重新计算这些值。
文档总页数与当前节总页数
FieldType.FieldNumPages 返回整个 Word 文档的总页数。如果文档中的每一节都有独立的页码编号,则可能需要显示类似:
第 2 页,共 8 页
这里的 8 表示当前节的总页数,而不是整个文档的总页数。这种情况下,可以将:
FieldType.FieldNumPages
替换为:
FieldType.FieldSectionPages
FieldType.FieldSectionPages 用于返回当前节的总页数。
如果当前节的页码也需要重新从某个数字开始编号,则还需要设置 RestartPageNumbering 和 PageStartingNumber。后文会进一步介绍这两个属性。
隐藏 Word 首页的页码
标题页、报告封面等通常不需要显示页码。Word 可以通过**“首页不同”**设置,让第一页使用独立于后续页面的页眉和页脚。
在 Spire.Doc for Python 中,可以通过以下属性控制:
section.PageSetup.DifferentFirstPageHeaderFooter
下面的示例为文档添加页码,但不在第一页显示:
from spire.doc import *
from spire.doc.common import *
# 加载 Word 文档
document = Document()
document.LoadFromFile("input.docx")
# 获取第一节
section = document.Sections[0]
# 设置首页使用不同的页眉和页脚
section.PageSetup.DifferentFirstPageHeaderFooter = True
# 在普通页脚中添加页码
footer = section.HeadersFooters.Footer
paragraph = footer.AddParagraph()
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
paragraph.AppendField(
"页码",
FieldType.FieldPage
)
# 首页页脚保持为空
# 保存结果
document.SaveToFile(
"no-page-number-on-first-page.docx",
FileFormat.Docx2016
)
document.Close()
这样,第一页的页脚保持为空,后续页面则使用包含页码的普通页脚。
这里有一点需要特别注意:隐藏第一页的页码,并不意味着第一页被排除在页码编号序列之外。 例如,封面虽然没有显示页码,但如果它仍然被计为第 1 页,那么下一页可能会显示为第 2 页。
如果希望封面之后的第一页正文真正显示为第 1 页,则需要将封面和正文放在不同的节中,并在正文节重新开始页码编号。
从指定数字开始设置 Word 页码
Word 页码并不一定要从 1 开始。例如,一个 Word 文件可能只是完整手册中的一部分,因此第一页需要从第 25 页开始编号。
在 Spire.Doc 中,可以通过以下两个属性控制:
RestartPageNumberingPageStartingNumber
下面的示例将第一节的起始页码设置为 5:
from spire.doc import *
from spire.doc.common import *
# 加载 Word 文档
document = Document()
document.LoadFromFile("input.docx")
# 获取第一节
section = document.Sections[0]
# 重新开始编号,并从 5 开始
section.PageSetup.RestartPageNumbering = True
section.PageSetup.PageStartingNumber = 5
# 在页脚中添加页码
footer = section.HeadersFooters.Footer
paragraph = footer.AddParagraph()
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
paragraph.AppendField(
"页码",
FieldType.FieldPage
)
# 保存结果
document.SaveToFile(
"page-number-starts-at-5.docx",
FileFormat.Docx2016
)
document.Close()
设置后,该节第一页显示为 5,后续页面依次显示 6、7、8……。
这种方式适合处理文档片段、附录、书籍章节,或者后续需要合并到更大文档中的独立文件。
在新的节中重新开始页码编号
有时需要让封面之后的正文重新从第 1 页开始编号。仅仅隐藏封面上的页码无法达到这一效果,因为封面仍然可能参与页码计数。更合适的 Word 文档结构是:
第 1 节
└── 封面
第 2 节
├── 第 1 页
├── 第 2 页
└── 第 3 页
如果文档已经在封面后插入了分节符,就可以在第二节重新从 1 开始编号:
from spire.doc import *
from spire.doc.common import *
# 加载至少包含两个节的 Word 文档
document = Document()
document.LoadFromFile("report-with-cover.docx")
# 获取正文所在的节
section = document.Sections[1]
# 取消页脚与前一节的链接
section.HeadersFooters.Footer.LinkToPrevious = False
# 从 1 重新开始编号
section.PageSetup.RestartPageNumbering = True
section.PageSetup.PageStartingNumber = 1
# 添加页码
footer = section.HeadersFooters.Footer
paragraph = footer.AddParagraph()
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
paragraph.AppendField(
"页码",
FieldType.FieldPage
)
# 保存结果
document.SaveToFile(
"report-page-1-after-cover.docx",
FileFormat.Docx2016
)
document.Close()
处理多节 Word 文档时,需要特别注意 LinkToPrevious。Word 中一个节的页眉和页脚可以链接到前一节。如果没有取消链接,在一个节中修改页脚时,可能会对其他节产生意外影响。
为不同节设置不同的页码格式
书籍、学位论文、规范和正式报告等文档,经常会在不同部分采用不同的页码格式。例如:
目录 i
前言 ii
执行摘要 iii
第 1 章 1
第 2 章 2
第 3 章 3
你可以通过 PageNumberStyle 设置页码格式。常用样式包括:
Arabic→ 1、2、3RomanLower→ i、ii、iiiRomanUpper→ I、II、IIILetterLower→ a、b、cLetterUpper→ A、B、C
假设 Word 文档包含两个节:
- 第 1 节为前置部分,应使用小写罗马数字。
- 第 2 节为正文,应使用阿拉伯数字从 1 开始编号。
可以使用以下代码分别为两个节设置不同页码格式:
from spire.doc import *
from spire.doc.common import *
# 加载 Word 文档
document = Document()
document.LoadFromFile("multi-section-report.docx")
# -----------------------------
# 第 1 节:前置部分
# -----------------------------
front_section = document.Sections[0]
front_section.PageSetup.RestartPageNumbering = True
front_section.PageSetup.PageStartingNumber = 1
front_section.PageSetup.PageNumberStyle = PageNumberStyle.RomanLower
front_footer = front_section.HeadersFooters.Footer
front_paragraph = front_footer.AddParagraph()
front_paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
front_paragraph.AppendField(
"前置部分页码",
FieldType.FieldPage
)
# -----------------------------
# 第 2 节:正文
# -----------------------------
main_section = document.Sections[1]
# 取消与第 1 节页脚的链接
main_section.HeadersFooters.Footer.LinkToPrevious = False
# 从 1 重新开始编号
main_section.PageSetup.RestartPageNumbering = True
main_section.PageSetup.PageStartingNumber = 1
main_section.PageSetup.PageNumberStyle = PageNumberStyle.Arabic
main_footer = main_section.HeadersFooters.Footer
main_paragraph = main_footer.AddParagraph()
main_paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
main_paragraph.AppendField(
"正文页码",
FieldType.FieldPage
)
# 保存结果
document.SaveToFile(
"roman-and-arabic-page-numbers.docx",
FileFormat.Docx2016
)
document.Close()
这样就可以在同一个 Word 文档中建立两套独立的页码编号规则:前置部分使用 i、ii、iii……,正文则重新从 1、2、3…… 开始。
如果文档中还包含不显示页码的标题页,并且要求前置部分从 i 开始,则应将标题页单独放在一个节中,然后在前置部分所在的节重新开始页码编号。
仅为 Word 文档中的指定节添加页码
有时并不是整个 Word 文档都需要显示页码。例如:
封面 不显示页码
引言 不显示页码
正文报告 第 1 页……
附录 不显示页码
这种情况下,应将文档视为多个独立的节,而不是为所有页面统一添加页码。对于需要显示页码的目标节,可以通过以下步骤为其单独进行设置:
- 取消该节页脚与前一节的链接。
- 根据需要重新开始页码编号。
- 添加页码域。
- 如果后面的节不需要页码,还要避免它们继承当前节的页脚。
核心代码:
# 获取需要添加页码的节
section = document.Sections[1]
# 取消与前一节页脚的链接
section.HeadersFooters.Footer.LinkToPrevious = False
# 重新开始页码编号
section.PageSetup.RestartPageNumbering = True
section.PageSetup.PageStartingNumber = 1
# 添加页码
footer = section.HeadersFooters.Footer
paragraph = footer.AddParagraph()
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
paragraph.AppendField(
"页码",
FieldType.FieldPage
)
# 防止后一节继承当前节的页脚
next_section = document.Sections[2]
next_section.HeadersFooters.Footer.LinkToPrevious = False
next_section.HeadersFooters.Footer.ChildObjects.Clear()
注意: ChildObjects.Clear() 会清除页脚中的所有内容,而不仅仅是页码。如果页脚中还包含日期、公司名称或其他需要保留的内容,应只删除页码域,而不要直接清空整个页脚。
应该选择哪种 Word 页码设置方式?
具体采用哪种方式,取决于文档的页码需求:
| 需求 | 推荐方式 |
|---|---|
| 添加普通连续页码 | FieldPage |
| 显示“第 X 页,共 Y 页” | FieldPage + FieldNumPages |
| 显示当前节的“第 X 页,共 Y 页” | FieldPage + FieldSectionPages |
| 首页不显示页码 | DifferentFirstPageHeaderFooter |
| 从指定数字开始编号 | PageStartingNumber |
| 在某个节重新开始编号 | RestartPageNumbering |
| 使用 i、ii、iii | PageNumberStyle.RomanLower |
| 使用 I、II、III | PageNumberStyle.RomanUpper |
| 让不同节使用独立页脚 | 禁用 LinkToPrevious |
对于结构简单的文档,通常只需要 FieldPage 即可。
而包含封面、章节或多个独立节的文档,则往往需要结合页码域和节级别的设置来控制页码规则。
使用 Python 设置 Word 页码时的常见问题
1. 新的节仍然延续上一节的页码
检查当前节是否设置了:
section.PageSetup.RestartPageNumbering = True
并设置所需的起始页码,例如:
section.PageSetup.PageStartingNumber = 1
2. 修改一个节的页脚后,其他节也发生变化
这种情况通常是因为当前节的页脚仍然链接到前一节。在创建独立页脚之前,先取消链接:
section.HeadersFooters.Footer.LinkToPrevious = False
3. 封面没有显示页码,但第二页却显示为第 2 页
“首页不同”只控制第一页是否显示页码,并不会自动让第二个物理页面变成第 1 页。
如果希望封面不参与正文页码编号,应将正文放在另一个节中,并在正文节重新从 1 开始编号。
4. “第 X 页,共 Y 页”显示的总页数不正确
应根据需要选择对应的域。下面的域:
FieldType.FieldNumPages
用于获取整个文档的总页数。
而:
FieldType.FieldSectionPages
用于获取当前节的总页数。
如果希望每个节都显示自己独立的“第 X 页,共 Y 页”,还需要在相应节中重新设置页码编号。
总结
添加页码可以让较长的 Word 文档更方便浏览,也能使报告、手册、论文等结构化文档更加清晰、规范。
本文介绍了如何使用 Python 为 Word 文档添加和自定义页码,包括普通连续页码、“第 X 页,共 Y 页”、指定起始页码数字、隐藏首页页码、分节编号以及不同页码格式等常见设置。
通过这些方法,你可以同时处理普通 Word 文档,以及包含封面、前置部分、章节和多个独立节的复杂文档结构。
以上就是使用Python为Word文档添加自定义页码的详细内容,更多关于Python Word添加页码的资料请关注脚本之家其它相关文章!
