当前位置: 代码网 > it编程>前端脚本>Python > Python批量设置Word页眉页脚的完整思路详解

Python批量设置Word页眉页脚的完整思路详解

2026年10月11日 • Python •我要评论
对外分发的 word 文档,页眉页脚就是门面:页码方便引用定位,公司标识与密级标注承担识别和防泄密职能。在 word 里手工给一份文档加页眉不难,难的是保持一致——几十份报告的

对外分发的 word 文档,页眉页脚就是门面:页码方便引用定位,公司标识与密级标注承担识别和防泄密职能。在 word 里手工给一份文档加页眉不难,难的是保持一致——几十份报告的页眉格式统一、封面页不显示页码、双面打印时页码永远靠外侧,这些细节手工做既慢又容易漏。交给代码做,一次配置可以反复套用。

本文使用 free spire.doc for python 演示页眉页脚的完整配置链路:基础文字页眉与页码域、封面页独立处理、奇偶页不同、logo 图片页眉的两种放法、跨文档复制统一格式,以及分发前的页眉锁定。

pip install spire.doc.free

演示输入是两份文件:季度业务报告.docx(4 页,第 1 页为封面,后 3 页为正文,含一个财务数据表格)和 2025年度报告.docx(2 页历史文档,没有任何页眉页脚)。

原始封面

先弄清两个默认值

页眉页脚排版由 pagesetup 上的两个距离参数控制。headerdistance 是页眉起点距页顶的距离,footerdistance 是页脚起点距页底的距离,新建文档的默认值都是 36.0 pt。

这个默认值和页边距的关系决定了页眉的可用高度:正文区从上边距 72 pt 处开始,页眉从 36 pt 处开始,两者之间约 36 pt 的空间就是页眉的实际可用高度。单行 9 pt 小字页眉加一条分隔线绰绰有余;一旦放高图片,页眉区放不下时正文就会整体下移——这正是后面 logo 两种放法产生差异的原因。

基础页眉页脚:文字页眉 + 页码域

section.headersfooters 下挂着 header 和 footer 两个容器,各自 addparagraph 后按普通段落排版即可。页码用域字段插入,fieldpage 是当前页码,fieldnumpages 是总页数:

from spire.doc import *
from spire.doc.common import *

document = document()
document.loadfromfile("季度业务报告.docx")
section = document.sections[0]

# 页眉:公司标识 + 报告名,灰色 9pt,底部单线
header_paragraph = section.headersfooters.header.addparagraph()
tr = header_paragraph.appendtext("星河科技 · 2026 年第三季度业务报告")
tr.characterformat.fontname = "微软雅黑"
tr.characterformat.fontsize = 9
tr.characterformat.textcolor = color.fromargb(255, 110, 116, 124)
header_paragraph.format.borders.bottom.bordertype = borderstyle.single
header_paragraph.format.borders.bottom.space = 1.0

# 页脚:第 x 页,共 y 页(域字段),右对齐,顶部单线
footer_paragraph = section.headersfooters.footer.addparagraph()
footer_paragraph.format.horizontalalignment = horizontalalignment.right
footer_paragraph.appendtext("第 ")
footer_paragraph.appendfield("page number", fieldtype.fieldpage)
footer_paragraph.appendtext(" 页,共 ")
footer_paragraph.appendfield("number of pages", fieldtype.fieldnumpages)
footer_paragraph.appendtext(" 页")

域字段的部分文字属性需要单独设置。appendfield 返回的是域对象而非 textrange,混排时"第 x 页"里的"第""页"二字通过 appendtext 的返回值设置格式,域本身的字体则要在插入后遍历段落的 childobjects,对 documentobjecttype.textrange 类型的对象逐个设置——域求值后的文字也属于 textrange:

for k in range(footer_paragraph.childobjects.count):
    obj = footer_paragraph.childobjects.get_item(k)
    if obj.documentobjecttype == documentobjecttype.textrange:
        obj.characterformat.fontname = "微软雅黑"
        obj.characterformat.fontsize = 9
        obj.characterformat.textcolor = color.fromargb(255, 110, 116, 124)

页码必须用域而不能写死。这份报告 4 页,手工填"1 / 4"看似可行,但正文一旦增删一页,所有页的数字就全错了;域字段在每次打开或渲染时重新求值,页码始终正确。渲染输出里页脚显示"2 / 4",说明两个域都已正确求值。

基础页眉页脚效果

封面页:首页独立,保持空白

带封面的报告不应在封面出现页眉和页码。pagesetup.differentfirstpageheaderfooter 打开后,第 1 页改用 firstpageheader 和 firstpagefooter 两个独立容器,其余页面继续用常规的 header / footer:

document = document()
document.loadfromfile("季度业务报告_基础页眉页脚.docx")
section = document.sections[0]

# 打开"首页不同"开关
section.pagesetup.differentfirstpageheaderfooter = true

# firstpageheader / firstpagefooter 不添加任何内容,封面即保持空白

这里不需要"清除"操作:firstpageheader 是独立容器,留空就是空白封面,常规页眉不受影响。保存后检查,firstpageheader 与 firstpagefooter 的段落数都是 0,封面页渲染确认无页眉线、无页码,第 2 页起的页眉页脚原样保留。

封面空白效果

奇偶页不同:为双面打印准备

报告双面打印装订时,页码应该始终靠外侧——奇数页(右手页)靠右,偶数页(左手页)靠左,翻阅时页码位置固定。密级标注也常只放偶数页页眉。这需要打开第二个开关 differentoddandevenpagesheaderfooter,两个开关可以叠加:

document = document()
document.loadfromfile("季度业务报告_基础页眉页脚.docx")
section = document.sections[0]

# 封面空白 + 奇偶页不同,两个开关叠加
section.pagesetup.differentfirstpageheaderfooter = true
section.pagesetup.differentoddandevenpagesheaderfooter = true

# 开关打开后,原 header/footer 只作用于奇数页
# 偶数页页眉:密级标注,右对齐(靠外侧)
even_header = section.headersfooters.evenheader.addparagraph()
even_header.format.horizontalalignment = horizontalalignment.right
tr = even_header.appendtext("星河科技 · 机密")
tr.characterformat.fontname = "微软雅黑"
tr.characterformat.fontsize = 9
tr.characterformat.textcolor = color.fromargb(255, 110, 116, 124)
even_header.format.borders.bottom.bordertype = borderstyle.single

# 偶数页页脚:页码左对齐(靠外侧)
even_footer = section.headersfooters.evenfooter.addparagraph()
even_footer.format.horizontalalignment = horizontalalignment.left
even_footer.appendfield("page number", fieldtype.fieldpage)
even_footer.appendtext(" / ")
even_footer.appendfield("number of pages", fieldtype.fieldnumpages)

开关的语义容易误解:打开奇偶开关后,之前设置在 header / footer 上的内容只作用于奇数页,偶数页必须单独往 evenheader / evenfooter 里写——漏写的话偶数页页眉直接消失,不是继承奇数页的设置。渲染确认:第 2 页(偶数页)页眉为"星河科技 · 机密"、页码"2 / 4"居左;第 3 页(奇数页)页眉为报告名、页码"3 / 4"居右。

奇偶页效果

logo 页眉:行内与浮动是两件事

公司 logo 放页眉有两种放法,效果差别很大。appendpicture 返回的 docpicture 支持 width / height 设置显示尺寸,源图 800 × 200 px 按 1/4 缩放为 200 × 50 pt。

行内图片参与页眉段落的文字排版,页眉行高会被撑到图片高度:

header_paragraph = section.headersfooters.header.addparagraph()
pic = header_paragraph.appendpicture("星河科技_logo.png")
pic.width = 200.0     # 显示尺寸 200 × 50 pt
pic.height = 50.0
header_paragraph.format.borders.bottom.bordertype = borderstyle.single

浮动图片把环绕方式设为 behind(衬于文字下方)、定位基准改为页面,图片就脱离文字流,不再占用页眉行高:

pic = header_paragraph.appendpicture("星河科技_logo.png")
pic.textwrappingstyle = textwrappingstyle.behind
pic.horizontalorigin = horizontalorigin.page       # 水平定位基准:页面左缘
pic.verticalorigin = verticalorigin.page           # 垂直定位基准:页面顶缘
pic.verticalalignment = shapeverticalalignment.top
pic.width = 200.0
pic.height = 50.0

两种放法渲染后的差异可以用正文起始位置量化:行内版正文第一行墨迹出现在页面渲染图第 61 行像素,浮动版在第 13 行——行内 logo 的 50 pt 高度全部转化为正文下移,浮动 logo 则完全不占版面空间。如果 logo 只是页眉的装饰性元素,用浮动;如果页眉就是要展示完整的企业标识横幅,行内更直观。源图按显示尺寸的整数倍准备(这里 4 倍)可以避免缩放锯齿。

行内与浮动 logo 对比

跨文档统一:clone 是必须的

存量文档没有页眉,一份份重配不现实。规范做法是把一份做好的文档当模板,把页眉页脚对象复制过去:

source = document()
source.loadfromfile("季度业务报告_基础页眉页脚.docx")
src_header = source.sections[0].headersfooters.header
src_footer = source.sections[0].headersfooters.footer

target = document()
target.loadfromfile("2025年度报告.docx")

for i in range(target.sections.count):
    section = target.sections.get_item(i)
    for j in range(src_header.childobjects.count):
        obj = src_header.childobjects.get_item(j)
        section.headersfooters.header.childobjects.add(obj.clone())
    for j in range(src_footer.childobjects.count):
        obj = src_footer.childobjects.get_item(j)
        section.headersfooters.footer.childobjects.add(obj.clone())

跨文档复制必须调用 clone()。页眉段落对象归属于源文档的对象树,直接 add 原对象会让两个文档共享同一块内存,保存时内容错乱;clone 生成深拷贝,各自独立。本次运行复制了页眉对象 1 个、页脚对象 1 个(各是一个段落),2025年度报告.docx 渲染确认第 1 页出现页眉线与页脚"1 / 2"。

历史文档统一页眉

分发前锁定页眉

页眉页脚做好后,文档正文还需要他人补充数据,但页眉的密级标注和 logo 不应被随手改动。用窗体保护配合节级豁免实现"正文可编辑、页眉页脚锁定":

document = document()
document.loadfromfile("季度业务报告_基础页眉页脚.docx")
section = document.sections[0]
# 全文按"只能填写窗体"保护(此类型下页眉页脚不可编辑)
document.protect(protectiontype.allowonlyformfields, "xh2026")
# 第 1 节豁免窗体保护:正文保持可编辑
section.protectform = false

protect 的第一个参数选 allowonlyformfields 而不是 readonly,是因为前者允许配合节级豁免——protectform = false 的节里正文仍可自由编辑,而页眉页脚不在豁免范围,保持锁定。保存后重新加载验证,getprotectiontype() 返回 allowonlyformfields,第 1 节 protectform 为 false,与设置一致;渲染外观与未保护的版本完全相同,保护不影响文档显示。

适用场景与嵌入方式

这条配置链路适合两类场景。一是报告批量生成的末端环节:上游系统产出正文后,按文档类型套用对应的页眉配置——对外报告用 logo 浮动页眉加页码域,内部资料用密级标注加奇偶页页码。二是存量文档的规范化:交接、归档或应付审计前,用 clone 复制的方式把历史文档统一到同一套页眉模板,不用逐份打开手工设置。

配置本身建议与代码分离:页眉文字、字体颜色、logo 路径、用哪些开关,放进 json 或 yaml 配置文件,脚本读取后按文档类型选择模板,新增一种报告规格时只改配置不改代码。锁定环节只在文档即将外发时执行,密码由分发流程统一管理。

本文全部操作与渲染输出在 free spire.doc for python 环境实测通过;涉及文档加载、页眉页脚读写、图片插入与保护均为免费版可用功能。

以上就是python批量设置word页眉页脚的完整思路详解的详细内容,更多关于python设置word页眉页脚的资料请关注代码网其它相关文章!

赞 (0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com