我的知识记录

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_widthpage_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_PAGECONTINUOUS
  • 修改分节后页边距需要单独设置 section.left_margin 等,否则会继承上一节。

Python Word插入分页符分节符:自动排版

标签:

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

上一篇:Python Word批量加水印文字:保密字样

下一篇:Python Word插入超链接:外链和邮箱链接