查看: 177|回复: 3

Python自动化Word页眉页脚:Spire.Doc首页奇偶页设置

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在批量处理 Word 文档时,页眉页脚往往比正文排版更容易出现重复劳动和规则错乱,尤其是封面不显示页眉、双面打印奇偶页位置不同、页码需要随页数变化等场景。本文围绕 Spire.Doc for Python 的对象模型,把常见页眉页脚操作拆成可复用函数,说明文本、图片、页码域、页眉表格以及首页/奇偶页差异化的代码实现和参数注意点。

环境准备

本文示例使用 Spire.Doc for Python,通过 pip 安装:
  1. pip install Spire.Doc
复制代码

安装后在脚本中导入模块:
  1. from spire.doc import *
  2. from spire.doc.common import *
复制代码

一、页眉页脚中写入文本、图片和页码

页眉通常放文档标题、公司名称或 Logo,页脚多用于页码。该库通过 Section.HeadersFooters.Header 和 Section.HeadersFooters.Footer 分别获取页眉、页脚对象,再向其中添加段落和内容。下面的函数把操作封装起来,便于对多个节复用,同时演示图片、文本、边框和页码域的组合使用:
  1. def InsertHeaderAndFooter(section):
  2.     header = section.HeadersFooters.Header
  3.     footer = section.HeadersFooters.Footer
  4.     headerParagraph = header.AddParagraph()
  5.     headerPicture = headerParagraph.AppendPicture('Header.png')
  6.     text = headerParagraph.AppendText('添加页眉')
  7.     text.CharacterFormat.FontName = '宋体'
  8.     text.CharacterFormat.FontSize = 10
  9.     text.CharacterFormat.Italic = True
  10.     headerParagraph.Format.HorizontalAlignment = HorizontalAlignment.Right
  11.     headerParagraph.Format.Borders.Bottom.BorderType = BorderStyle.Single
  12.     headerParagraph.Format.Borders.Bottom.Space = 0.05
  13.     headerPicture.TextWrappingStyle = TextWrappingStyle.Behind
  14.     headerPicture.HorizontalOrigin = HorizontalOrigin.Page
  15.     headerPicture.HorizontalAlignment = ShapeHorizontalAlignment.Left
  16.     headerPicture.VerticalOrigin = VerticalOrigin.Page
  17.     headerPicture.VerticalAlignment = ShapeVerticalAlignment.Top
  18.     footerParagraph = footer.AddParagraph()
  19.     footerPicture = footerParagraph.AppendPicture('Footer.png')
  20.     footerPicture.TextWrappingStyle = TextWrappingStyle.Behind
  21.     footerPicture.HorizontalOrigin = HorizontalOrigin.Page
  22.     footerPicture.HorizontalAlignment = ShapeHorizontalAlignment.Left
  23.     footerPicture.VerticalOrigin = VerticalOrigin.Page
  24.     footerPicture.VerticalAlignment = ShapeVerticalAlignment.Bottom
  25.     footerParagraph.AppendText('第 ')
  26.     footerParagraph.AppendField('页码', FieldType.FieldPage)
  27.     footerParagraph.AppendText('页 共 ')
  28.     footerParagraph.AppendField('页数', FieldType.FieldNumPages)
  29.     footerParagraph.AppendText('页')
  30.     footerParagraph.Format.HorizontalAlignment = HorizontalAlignment.Center
  31.     footerParagraph.Format.Borders.Top.BorderType = BorderStyle.Single
  32.     footerParagraph.Format.Borders.Top.Space = 0.05
  33. document = Document()
  34. document.LoadFromFile('示例文档.docx')
  35. section = document.Sections.get_Item(0)
  36. InsertHeaderAndFooter(section)
  37. document.SaveToFile('添加页眉页脚.docx', FileFormat.Docx)
  38. document.Close()
复制代码

这里有两个关键点。第一,页码必须使用域字段 FieldType.FieldPage 与 FieldType.FieldNumPages,不能手动填写固定数字,否则文档页数变化后页码会错位。第二,页眉页脚中的图片通过 HorizontalOrigin.Page 和 VerticalOrigin.Page 以页面为参照定位,配合 TextWrappingStyle.Behind 衬于文字下方,可以避免挤压正文区域。

二、在页眉中插入表格

有些场景需要在页眉放置出版号、日期、文档编号等结构化信息。该库支持直接在页眉中添加表格,行高、单元格对齐方式、背景色都可以逐项设置:
  1. def InsertTableToHeader(section):
  2.     header = section.HeadersFooters.Header
  3.     tableHeader = header.AddTable(True)
  4.     tableHeader.ResetCells(2, 2)
  5.     data = [['出版号', '日期'], ['SC12546', '2019年7月24日']]
  6.     for i in range(len(data)):
  7.         dataRow = tableHeader.Rows.get_Item(i)
  8.         dataRow.Height = 20
  9.         dataRow.HeightType = TableRowHeightType.Exactly
  10.         dataRow.RowFormat.BackColor = Color.Empty()
  11.         for c in range(len(data[i])):
  12.             dataRow.Cells[c].CellFormat.VerticalAlignment = VerticalAlignment.Middle
  13.             dataRow.Cells[c].CellFormat.HorizontalAlignment = HorizontalAlignment.Center
  14.             range = dataRow.Cells[c].AddParagraph().AppendText(data[i][c])
  15.             range.CharacterFormat.FontName = '宋体'
复制代码

需要注意,页眉表格会占用页眉区域高度。如果表格行数较多,应同步调整 section.PageSetup.HeaderDistance,避免正文被向下推挤。

三、首页不同的处理方式

正式报告常要求封面不显示页眉页脚。将 DifferentFirstPageHeaderFooter 设为 True 后,第一节的第一页会使用独立的 FirstPageHeader 和 FirstPageFooter 容器,其余页面仍然使用常规的 Header 与 Footer:
  1. section.PageSetup.DifferentFirstPageHeaderFooter = True
  2. p1 = section.HeadersFooters.FirstPageHeader.AddParagraph()
  3. p1.Format.HorizontalAlignment = HorizontalAlignment.Left
  4. r1 = p1.AppendText('首页页眉')
  5. r1.CharacterFormat.FontName = '宋体'
  6. r1.CharacterFormat.FontSize = 12
  7. p2 = section.HeadersFooters.FirstPageFooter.AddParagraph()
  8. p2.Format.HorizontalAlignment = HorizontalAlignment.Left
  9. r2 = p2.AppendText('首页页脚')
  10. r2.CharacterFormat.FontName = '宋体'
  11. r2.CharacterFormat.FontSize = 12
  12. p3 = section.HeadersFooters.Header.AddParagraph()
  13. p3.Format.HorizontalAlignment = HorizontalAlignment.Right
  14. r3 = p3.AppendText('非首页页眉')
  15. r3.CharacterFormat.FontName = '微软雅黑'
  16. r3.CharacterFormat.FontSize = 14
  17. p4 = section.HeadersFooters.Footer.AddParagraph()
  18. p4.Format.HorizontalAlignment = HorizontalAlignment.Right
  19. r4 = p4.AppendText('非首页页脚')
  20. r4.CharacterFormat.FontName = '微软雅黑'
  21. r4.CharacterFormat.FontSize = 14
复制代码

开启“首页不同”后,FirstPageHeader 与 FirstPageFooter 是独立对象。只要不向其中添加任何内容,封面就不会显示页眉页脚,无需额外执行清除操作。

四、奇偶页不同的处理方式

双面打印装订时,页码通常要求靠外侧对齐。开启 DifferentOddAndEvenPagesHeaderFooter 后,需要分别操作 OddHeader、OddFooter 与 EvenHeader、EvenFooter。按原文说明,原先设置在 Header / Footer 上的内容只对奇数页生效,偶数页要单独设置 Even 容器:
  1. section.PageSetup.DifferentOddAndEvenPagesHeaderFooter = True
  2. P3 = section.HeadersFooters.OddHeader.AddParagraph()
  3. OH = P3.AppendText('奇数页页眉')
  4. P3.Format.HorizontalAlignment = HorizontalAlignment.Center
  5. OH.CharacterFormat.FontName = '微软雅黑'
  6. OH.CharacterFormat.FontSize = 10
  7. P2 = section.HeadersFooters.OddFooter.AddParagraph()
  8. OF = P2.AppendText('奇数页页脚')
  9. P2.Format.HorizontalAlignment = HorizontalAlignment.Center
  10. OF.CharacterFormat.FontName = '微软雅黑'
  11. OF.CharacterFormat.FontSize = 10
  12. P4 = section.HeadersFooters.EvenHeader.AddParagraph()
  13. EH = P4.AppendText('偶数页页眉')
  14. P4.Format.HorizontalAlignment = HorizontalAlignment.Center
  15. EH.CharacterFormat.FontName = '微软雅黑'
  16. EH.CharacterFormat.FontSize = 10
  17. P1 = section.HeadersFooters.EvenFooter.AddParagraph()
  18. EF = P1.AppendText('偶数页页脚')
  19. EF.CharacterFormat.FontName = '微软雅黑'
  20. EF.CharacterFormat.FontSize = 10
  21. P1.Format.HorizontalAlignment = HorizontalAlignment.Center
复制代码

两个开关可以叠加使用。如果同时开启首页不同与奇偶页不同,需要确保 FirstPageHeader、OddHeader、EvenHeader 三个容器都有明确的处理逻辑,避免某类页面出现空白页眉或残留内容。另外,HeadersFooters 是按节独立管理的,多节文档需要遍历 document.Sections 逐节设置,不能只处理第一节。

五、调整页眉页脚与正文的距离

页眉页脚区域高度由 HeaderDistance 和 FooterDistance 控制,单位为磅(pt)。默认值通常为 36 pt,适合单行小字。如果页眉中放入较高的 Logo 或表格,或者页脚内容较多,正文可能被向下推挤,此时可以适当调小这两个值,让页眉页脚更贴近页面边缘:
  1. section.PageSetup.HeaderDistance = 30
  2. section.PageSetup.FooterDistance = 30
复制代码

调整时要注意,HeaderDistance 过小可能导致页眉内容被裁切,建议结合页边距一起考虑。正文的上边距至少应大于页眉距离加上页眉实际高度。

六、实践要点

1. 页码使用 FieldType.FieldPage 与 FieldType.FieldNumPages 域字段,不要写固定数字,避免页数变化后错位。

2. HeadersFooters 按节独立管理,多节文档需遍历 document.Sections 逐节设置,并留意节与节之间是否存在继承关系。

3. 首页不同、奇偶页不同可以叠加,但要分别处理 FirstPageHeader、OddHeader、EvenHeader 等容器,避免出现空白页眉或残留内容。

4. 页眉中放图片或表格时,要同步检查 HeaderDistance 和正文页边距,防止正文被推挤或页眉被裁切。

5. 如果文档结构复杂,建议先在 Word 中理清各节页眉页脚设置状态,再编写脚本,避免代码与文档实际状态不一致。不同文档处理库在页眉页脚对象模型上也有差异,迁移代码时需要留意容器名称和定位方式的对应关系。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python自动化Word页眉页脚:Spire.Doc首页奇偶页设置

感谢分享,内容挺实用的。把页眉页脚操作封装成函数,对多节文档复用很友好;页码用 FieldPage 和 FieldNumPages 这两个域字段这点也很关键,手动填固定数字确实容易出错。图片以页面为参照定位、配合 Behind 避免挤压正文,也讲得比较清楚。 不过标题提到的首页不显示页眉、奇偶页不同这些差异化设置,正文里好像还没展开;页眉表格那段代码也像是没贴完。期待后续把首页/奇偶页设置和表格部分补全,整体会更完整。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python自动化Word页眉页脚:Spire.Doc首页奇偶页设置

感谢分享,这套把页眉页脚操作封装成函数的思路很实用,尤其适合一次处理多个节或多个文档的场景。文里提到的两个注意点我很有共鸣:页码一定要用 FieldPage 和 FieldNumPages 这类域字段,手动写死数字在文档页数变化后确实容易出问题;图片用 HorizontalOrigin.Page 和 VerticalOrigin.Page 配合 Behind 衬于文字下方,也能避免把正文区域挤乱,这个细节对排版要求高的文档很关键。 另外有个小提醒,正文在“二、在页眉中插入表格”那里好像没贴完,表格数据只显示到“SC”就断了,后面首页不显示页眉、奇偶页差异化设置的部分也还没展开。如果方便的话,可以把表格插入的完整示例和首页奇偶页的设置代码补上,特别是奇偶页不同页眉时 Sections 里相关属性的开启顺序和注意事项,这部分对双面打印场景会很有帮助。整体内容已经很有参考价值了,期待后续。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python自动化Word页眉页脚:Spire.Doc首页奇偶页设置

楼主的思路很实用,把页眉页脚操作封装成函数确实方便对多个节复用,批量处理文档时能省掉不少重复代码。几个细节我也很有同感:页码用 FieldType.FieldPage 和 FieldType.FieldNumPages 这两个域字段而不是写死数字,这一点非常关键,不然文档页数一变页码就对不上了;还有页眉页脚里的图片用 HorizontalOrigin.Page、VerticalOrigin.Page 再配合 TextWrappingStyle.Behind 定位,确实能避免图片把正文区域挤变形的问题。表格那部分用 AddTable 之后 ResetCells 再逐格设置,对出版号、日期这类结构化信息很合适。 另外想请教一下,首帖提到封面不显示页眉和奇偶页位置不同,但后面的内容好像被截断了。我猜应该是通过节属性里的 DifferentFirstPageHeaderFooter 和 OddAndEvenPagesHeaderFooter 来打开开关,然后再分别取 FirstPageHeader、EvenPageHeader 这些对象来设置,不知道实际操作时有没有什么坑,比如开启奇偶页之后原来的 Header 是落到奇数页还是需要重新赋值。还有多节文档遍历时,如果某节不想要页眉页脚,是不是要单独处理或者断开与前一节页眉的链接。期待楼主把后面的部分补完,尤其是首页和奇偶页差异化那一块,感觉
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-11-6 03:08 , Processed in 0.021689 second(s), 29 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部