如何使用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
相关产品推荐
相关产品推荐

