You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用python-docx让页码从指定页面开始并以1计数?

解决python-docx指定页面开始页码且起始为1的问题

要让指定section的页码从1开始,核心是给该section的页面设置添加w:pgNumType元素并指定w:start属性值为1,同时确保footer不继承前序section的设置。以下是修改后的完整可运行代码:

import docx
from docx.enum.section import WD_SECTION
from docx.oxml import OxmlElement, ns
from docx.shared import Pt

DEFAULT_FONT_NAME = '微软雅黑'  # 可替换为你需要的字体

def create_element(name):
    return OxmlElement(name)

def create_attribute(element, name, value):
    element.set(ns.qn(name), value)

def set_page_number_start(section, start_num):
    # 获取section的属性节点
    sectPr = section._sectPr
    # 创建w:pgNumType元素
    pgNumType = create_element('w:pgNumType')
    # 设置起始页码属性
    create_attribute(pgNumType, 'w:start', str(start_num))
    # 将pgNumType添加到sectPr中
    sectPr.append(pgNumType)

def add_page_number(section):
    # 确保footer有段落,避免索引错误
    if not section.footer.paragraphs:
        p = section.footer.add_paragraph()
    else:
        p = section.footer.paragraphs[0]
    
    p.alignment = 1  # 居中对齐
    p.style.font.size = Pt(9)
    p.style.font.name = DEFAULT_FONT_NAME

    run = p.add_run()
    fldChar1 = create_element('w:fldChar')
    create_attribute(fldChar1, 'w:fldCharType', 'begin')

    instrText = create_element('w:instrText')
    create_attribute(instrText, 'xml:space', 'preserve')
    instrText.text = "PAGE"

    fldChar2 = create_element('w:fldChar')
    create_attribute(fldChar2, 'w:fldCharType', 'end')

    run._r.append(fldChar1)
    run._r.append(instrText)
    run._r.append(fldChar2)

document = docx.Document()

# 前3个页面(无页码)
document.add_page_break()  # 第1页空白
document.add_page_break()  # 第2页空白
p = document.add_paragraph("Title")  # 第3页内容
document.add_page_break()

# 创建新section,从第4页开始显示页码
target_section = document.add_section(WD_SECTION.NEW_PAGE)
# 取消footer与前序section的关联
target_section.footer.is_linked_to_previous = False
# 设置该section的页码起始为1
set_page_number_start(target_section, 1)

# 添加该section的内容
document.add_paragraph("text of my first page with page number")
# 添加页码
add_page_number(target_section)

# 可多添加几页测试页码连续性
document.add_paragraph("text on page 2")
document.add_page_break()
document.add_paragraph("text on page 3")

document.save('example.docx')

关键修改说明:

  • 新增set_page_number_start函数:直接操作OXML节点,给目标section添加页码起始规则,通过w:start属性指定起始数字为1,这是让页码重新计数的核心。
  • 完善add_page_number函数:先判断footer是否存在段落,避免空列表索引报错,提升代码稳定性。
  • 调整调用顺序:创建目标section后,先断开footer的继承关系,再设置页码起始,最后添加内容和页码,确保规则生效。

内容的提问来源于stack exchange,提问作者AnastasiaShishkova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:05:12