Python Word插入分页符分节符:自动排版
用python-docx在Word指定位置插入分页符和分节符,批量给长文档每章自动另起一页,分节符支持横向/纵向切换,适合报告、标书自动排版。
场景痛点
写长报告时,每一章都要手动Ctrl+Enter插分页符,几十章下来手抖。更麻烦的是有横向表格页时,还要插入分节符单独改方向。用Python扫描一级标题,自动在标题前补分页符,分节符也能批量插,排版一步到位。
用到的库
pip install python-docx
完整代码
# -*- coding: utf-8 -*-
"""
1. 在每个指定样式的标题前自动插入分页符
2. 在指定位置插入分节符(可切换横向/纵向)
"""
from pathlib import Path
from docx import Document
from docx.enum.text import WD_BREAK
from docx.enum.section import WD_SECTION, WD_ORIENT
from docx.shared import Inches
def insert_page_break_before_heading(doc, heading_style_name="Heading 1"):
"""
遍历所有段落,在每个一级标题前插入分页符
跳过文档第一个标题(否则开头会多一页空白)
"""
count = 0
paragraphs = doc.paragraphs
for i, para in enumerate(paragraphs):
if para.style.name == heading_style_name:
if i == 0:
continue # 第一个标题不插
# 在这个段落最前面插一个分页符
run = para.runs[0] if para.runs else para.add_run()
run.add_break(WD_BREAK.PAGE)
# 上面 add_break 会把分页符加到段落开头,文字跟随其后
count += 1
return count
def add_section_break_with_orientation(doc, landscape=False):
"""
在文档末尾新增一个分节,并设置方向(横向/纵向)
常用于:正文纵向,中间插一节横向放宽表格
"""
new_section = doc.add_section(WD_SECTION.NEW_PAGE)
if landscape:
new_section.orientation = WD_ORIENT.LANDSCAPE
# 交换宽高
new_width, new_height = new_section.page_height, new_section.page_width
new_section.page_width = new_width
new_section.page_height = new_height
return new_section
def demo():
src = Path("./template.docx")
if not src.exists():
# 没有模板就新建一个演示
doc = Document()
doc.add_heading("第一章 概述", level=1)
doc.add_paragraph("这是第一章正文……")
doc.add_heading("第二章 方法", level=1)
doc.add_paragraph("这是第二章正文……")
doc.add_heading("第三章 数据", level=1)
doc.add_paragraph("这是第三章正文……")
else:
doc = Document(str(src))
# 1. 每个一级标题前自动分页
n = insert_page_break_before_heading(doc, "Heading 1")
print(f"插入了 {n} 个分页符")
# 2. 文档末尾加一个横向分节
sec = add_section_break_with_orientation(doc, landscape=True)
print(f"新增分节,方向:横向,纸张 {sec.page_width.cm:.1f} x {sec.page_height.cm:.1f} cm")
# 在横向节里加一段说明
p = doc.add_paragraph("(本页横向,用来放宽表格/大图)")
out = Path("./output_with_breaks.docx")
doc.save(str(out))
print(f"已保存:{out}")
if __name__ == "__main__":
demo()
代码讲解
insert_page_break_before_heading() 遍历段落,匹配 Heading 1 样式的段落。在该段落的第一个run上调用 add_break(WD_BREAK.PAGE),分页符就出现在标题文字前面,Word渲染时标题自然落到下一页。跳过第一个标题是因为文档开头不需要分页。
add_section_break_with_orientation() 用 doc.add_section(WD_SECTION.NEW_PAGE) 新增一个下一页分节。要横向的话,光改 orientation 不够,必须把 page_width 和 page_height 交换,否则Word只认宽高值不认方向标记。
运行结果
打开 output_with_breaks.docx,每个一级标题都从新的一页开始。文档末尾多了一个横向页,宽大于高。Word底部状态栏能看到"第X节",确认分节符生效。
注意事项
Heading 1是英文样式名。如果你的文档用的是中文样式"标题 1",要把判断改成para.style.name == "标题 1",可以先打印[p.style.name for p in doc.paragraphs]确认。- 分页符本质是段落里的一个break run,如果你想把分页符单独放一段更干净,可以新建空段落再
run.add_break(WD_BREAK.PAGE)。 - 分节符有"下一页/连续/偶数页/奇数页"四种,
WD_SECTION对应不同枚举,常用NEW_PAGE和CONTINUOUS。 - 修改分节后页边距需要单独设置
section.left_margin等,否则会继承上一节。

更新时间:2026-09-15 08:57:01