在word软件中通过在页眉或者页脚位置处添加就可以打开页面页脚设置界面,具体步骤见下图。
WORD软件中添加页眉和页脚 而在python-docx包中则要使用节(section)中的页眉(header)和页脚(footer)对象来具体设置。笔者将从页眉页脚内容的添加,对齐、页眉和页脚的距离、奇偶页不同和首页不同等5个方面叙述python-docx中对页眉页脚设置,最后将制作了本篇文章内容的思维导图。
在python-docx中要首先获取section对象。有关节的详细内容可以参考文章python-docx节的添加、定位和分节符的设置。通过section.header和section.footer来获取页眉和页脚对象。在页眉和页脚中内容是通过段落(paragraph)来添加的,例如:
from docx import Documentdocument = Document() # 新建文档header = document.sections[0].header # 获取第一个节的页眉print('页眉中默认段落数:', len(header.paragraphs))paragraph = header.paragraphs[0] # 获取页眉的第一个段落paragraph.add_run('这是第一节的页眉') # 添加页面内容footer = document.sections[0].footer # 获取第一个节的页脚paragraph = footer.paragraphs[0] # 获取页脚的第一个段落paragraph.add_run('这是第一节的页脚') # 添加页脚内容document.save('test.docx') # 保存文档添加内容程序运行结果见下图:
生成的文档效果见下图
在test.docx文档中默认增加了一个节。节中的页眉和页脚中都默认添加了一个段落,段落的内容,段落默认是左对齐。节中的页眉和页面都对应添加了“这是第一节的页眉”或者“这是第一节的页脚”。
连接上一节
在docx文档中含有多个节时,从第2个节开始,都默认使用上一个节的内容和样式。代码如下:
document = Document('test.docx')document.add_section() # 添加一个新的节document.add_section() # 添加第3个节运行后docx文档效果如下:
添加节后默认链接上一节 在docx文档中又添加了2个节,共计3个节,页面和页脚都显示了“与上一节相同”。在进行段落内容添加和设置时,如果不使用上一节的内容和样式要将header.is_linked_to_previous的属性或footer.is_linked_to_previous的属性设置为False,用于解除“链接上一节页眉”或者“链接上一节页脚”。代码如下:
header = document.sections[1].header # 获取第2个节的页眉header.is_linked_to_previous = False # 不使用上节内容和样式取消第2节的“链接上一节页眉”效果图如下
取消第2节的链接上一节 由于第2节取消了“链接上一节页眉”,所以第2节的页面是一个新的页眉,没有显示内容,在节上没有显示“与上一节相同”,而第3节的 “链接上一节页眉”仍然有效,将显示第2节的内容,即,没有内容。
设置对齐
页眉和页脚的内容是通过段落来添加的,所以通过设置段落的对齐方式就可以实现对页眉或者页脚的对齐。有关段落对齐以及更多的内容可以参考文章python-docx段落设置。以下代码分别对text.docx文档中的三个节分别设置对齐方式,代码如下:
header = document.sections[1].header # 获取第2个节的页眉,以演示对齐header.is_linked_to_previous = False # 不使用上节内容和样式,即重新设定paragraph = header.paragraphs[0]paragraph.add_run('这是第二节的页眉')paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置页眉居中对齐document.sections[1].footer.is_linked_to_previous = Falsefooter.paragraphs[0].add_run('这是第二节的页脚') # 添加第2节页脚内容footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置第2节页脚居中对齐header = document.sections[2].header # 获取第3个节的页眉header.is_linked_to_previous = False # 不使用上节的内容和样式paragraph = header.paragraphs[0] # 获取页眉中的段落paragraph.add_run('这是第三节的页眉')paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 设置页眉右对齐document.sections[2].footer.is_linked_to_previous = Falsefooter.paragraphs[0].add_run('这是第三节的页脚') # 添加第3节页脚内容footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 设置第3节页脚右对齐设置页眉页脚对齐后效果如下:
设置页眉页脚对齐后效果图 在文档中第1个节页眉和页脚的内容都是设置左对齐,第2节是居中对齐,第3个节是右对齐。虽然在paragraph.alignment属性中还有其他对齐方式,不过在页眉和页脚中主要使用这三种。
在section中的header_distance属性可以用来设置页眉距离顶端的距离,而footer_distance属性则用来设置页脚距离底端的距离,对应于word软件位置,见下图
在docx文档中默认页眉和页脚距离顶端和低端的距离都是1.27cm。
from docx.shared import Cm # 导入单位转换document.sections[0].footer_distance = Cm(3) # 设置页脚为3cmdocument.sections[0].header_distance = Cm(4) # 设置页眉为4cm改变页面和页脚距离后效果图如下
改变页面和页脚距离后效果图 将文档中的页眉设置成了4cm,将页脚设置成了3cm。
在python-docx中可以使用document.settings中的odd_and_even_pages_header_footer属性设置奇偶页不同,代码如下:
document = Document('test1.docx')print('默认文档奇偶页设置:', document.settings.odd_and_even_pages_header_footer)document.settings.odd_and_even_pages_header_footer = True设置文档的奇偶页状态结果如下:
设置文档的奇偶页状态结果图 文档效果见下图
设置文档的奇偶页状态效果图 在docx文档中odd_and_even_pages_header_footer属性默认为False,即文档的奇偶页是相同的。当设置为True时,启动了奇偶页不同。在python-docx中含有的偶数页页眉对象section.even_page_header,偶数页页脚对象section.even_page_footer;但却没有奇数页的对象,当设置的section.header或者section.footer时,默认设置在奇数页上。代码如下:
from docx.shared import Pt, Cmdocument = Document('test1.docx') # 读取text1.docx文档print('默认文档奇偶页设置:', document.settings.odd_and_even_pages_header_footer) # 打印奇偶页不同状态document.settings.odd_and_even_pages_header_footer = True # 启动奇偶页不同# 增加段落形成4个页paragraph = document.paragraphs[0]for i in range(80):paragraph.insert_paragraph_before('第' + str(i) + '段落')section = document.sections[0]header = section.headerheader.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # 设置页眉左对齐section.footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # 设置页脚左对齐even_page_header = section.even_page_header # 获取偶数页run = even_page_header.paragraphs[0].add_run('这是偶数页页眉')run.font.size = Pt(26) # 设置偶数页页眉大小even_page_header.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 设置页眉右对齐run = section.even_page_footer.paragraphs[0].add_run('这是偶数页页脚')run.font.size = Pt(26) # 设置偶数页页脚大小section.even_page_footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 设置页眉右对齐设置奇偶页不同的对齐方式效果,见下图
设置奇偶页不同的对齐方式效果图 在文档中将奇数页内容设置为左对齐,偶数页内容为右对齐。文档中将所有的页面分成了奇数也和偶数页两个部分。
设置首页不同要用到section中的
different_first_page_header_footer对象,对应于WORD软件位置,见下图。
WORD软件设置首页不同 打印文档中的首页不同对象的状态并开启代码如下:
different_first_page_header_footer对象内容添加代码如下:
document = Document('test2.docx')section = document.sections[0] # 获取第1个节的对象print('首页不同默认状态:', section.different_first_page_header_footer)section.different_first_page_header_footer = True # 设置启动首页不同打印并设置首页不同程序运行结果见下图
首页不同启动后生成的文档效果见下图
首页不同启动后的效果图 different_first_page_header_footer在docx文档中默认是Fasle。开启后节中的节中的对象分成了首页和非首页两个部分。首页对象要用到section.first_page_header获取。首页内容的添加代码如下:
first_page_header = section.first_page_header # 获取首页对象run = first_page_header.paragraphs[0].add_run('这是第一个节的首页页眉') # 添加节首页页眉内容run.font.size = Pt(26) # 设置首页页眉字体大小,便于演示文字内容first_page_header.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置首页页眉居中对齐first_page_footer = section.first_page_footer # 获取页脚对象run = first_page_footer.paragraphs[0].add_run('这是第一个节的首页页脚') # 添加节首页页脚内容run.font.size = Pt(26) # 设置首页页脚字体大小,便于演示文字内容first_page_footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置首页页脚居中对齐首页添加内容效果,见下图
首页添加内容效果图 在第一个节中首页页眉和页脚的内容添加后并设置成居中对齐。由于这个对象是在节内的属性,所有所用域是节,也就是说每个节都可以设置首页不同。
在docx包中当设置了首页不同、奇偶页不同时,同一个页面可能要受到不同属性的影响。此时设置优先级生效的顺序依次是首页不同>奇偶页>普通页。
笔者从页眉页脚内容添加、页眉页脚对齐、页眉和页脚距离、奇偶页不同和首页不同等5个部分叙述了python-docx包对docx文档页眉和页脚设置并制作了思维导图,见下图。
python-docx页眉和页脚设置图