python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Word添加页码

使用Python为Word文档添加自定义页码

作者:SunnyDays1011

在 Word 中添加页码看起来很简单,本文介绍了如何使用 Python 为 Word DOC 或 DOCX 文档添加和自定义页码,文中的示例代码讲解详细,感兴趣的小伙不可以了解下

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

在 Word 中添加页码看起来很简单,但当文档包含封面、多个节,或者不同部分需要采用不同的页码规则时,设置起来就会复杂不少。

普通报告可能只需要在页脚居中显示 1、2、3……。而论文、技术文档等往往有更复杂的要求,例如前置部分使用罗马数字,正文重新从第 1 页开始编号,或者标题页不显示页码。

如果只处理一个文档,在 Microsoft Word 中手动插入页码并不麻烦。但对于通过模板自动生成的文档,或者需要批量处理大量 Word 文件的场景,使用 Python 设置页码会更加高效。

本文将介绍以下内容:

安装所需的 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 改为 LeftRight,使页码左对齐或右对齐。

使用 Python 为 Word 添加“第 X 页,共 Y 页”格式的页码

对于报告、手册、方案等页数较多或需要打印的文档,仅显示当前页码有时不够直观。而使用:

第 3 页,共 12 页

这种格式可以同时告诉读者当前所在页面以及文档总页数。

要实现这一效果,可以组合使用 PAGENUMPAGES 两个域。其中,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 用于返回当前节的总页数。

如果当前节的页码也需要重新从某个数字开始编号,则还需要设置 RestartPageNumberingPageStartingNumber。后文会进一步介绍这两个属性。

隐藏 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 中,可以通过以下两个属性控制:

下面的示例将第一节的起始页码设置为 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 设置页码格式。常用样式包括:

假设 Word 文档包含两个节:

可以使用以下代码分别为两个节设置不同页码格式:

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 页……
附录             不显示页码

这种情况下,应将文档视为多个独立的节,而不是为所有页面统一添加页码。对于需要显示页码的目标节,可以通过以下步骤为其单独进行设置:

  1. 取消该节页脚与前一节的链接。
  2. 根据需要重新开始页码编号。
  3. 添加页码域。
  4. 如果后面的节不需要页码,还要避免它们继承当前节的页脚。

核心代码:

# 获取需要添加页码的节
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、iiiPageNumberStyle.RomanLower
使用 I、II、IIIPageNumberStyle.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添加页码的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文