前言
在使用python的docx库去处理文档内容时,发现需要去对每页添加页码,但是在网上找了好久的资料也几乎没有翻到什么有用的办法,很多都是AI灌水。
通过查找docx库的官方文档后,发现他们虽然给了页眉页脚的使用指南,但是没有提及怎么去加页码,截止到2023年11月,他们依旧没做相关的API接口,于是只能我们另外想其他的办法去解决这个问题。
解决方法
在翻阅很久的资料后,发现有很多的国外相关学习的人士也提出了这样的问题,他们给了两种解决思路。
第一种是直接在已经建立好的文档模板上面进行输入文字,这样就不需要考虑额外添加页码的问题了。
第二种是深入docx类型的更底层,lxml,通过字段的方式设置页码。
因为采用docx库以后肯定不想再去动手设置个模板,因此本人更加倾向于第二种的解决方法,虽然代码量长了一些。(希望官方早点把API接口给完善一下啊喂!)
代码
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
def create_element(name):
return OxmlElement(name)
def create_attribute(element, name, value):
element.set(qn(name), value)
def add_page_number(run):
fldChar1 = create_element('w:fldChar')
create_attribute(fldChar1, 'w:fldCharType', 'begin')
instrText = create_element('w:instrText')
create_attribute(instrText, 'xml:space', 'preserve')
instrText.text = "PAGE"
fldChar2 = create_element('w:fldChar')
create_attribute(fldChar2, 'w:fldCharType', 'end')
run._r.append(fldChar1)
run._r.append(instrText)
run._r.append(fldChar2)
doc = Document()
for i in range(50):
paragraph1 = doc.add_paragraph("这里是文字")
add_page_number(doc.sections[0].footer.paragraphs[0].add_run())
doc.sections[0].footer.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.save("mydoc.docx")
代码说明
实现的方法是把该节内的文档信息提取出来,直接将它的page字段作为页码写入页脚,也就是上述中的instrText,最后将页码设置成居中的方式,这样就可以在docx库中添加页码了。
页码的字体可以用docx的nomal方式进行改变。
如果需要在页眉加页码,方式也是同理,至于需要其他格式的页码,相信也不需要笔者多言了。
效果如下: