如何用python-docx将docx最后一页的页脚应用到所有页面?
解决Quarto生成Docx时页脚仅单页显示的问题
一、修复Python-docx代码的AttributeError问题
你之前的代码报错是两个原因:
- 索引越界:
document.sections[n_sections]里,n_sections是节的总数,索引从0开始,应该用document.sections[n_sections-1]获取最后一节 - 不能直接赋值footer:docx的Section.footer是只读属性,得复制目标footer的内容到其他节的footer里
修正后的代码示例:
from docx import Document document = Document(r"C:\dev\poetry-demo\poetry_demo\test.docx") target_section = document.sections[-1] # 获取有正确页脚的最后一节 target_footer = target_section.footer for section in document.sections: # 清空当前节的footer原有内容 for paragraph in section.footer.paragraphs: paragraph.clear() # 复制目标footer的段落内容与格式 for para in target_footer.paragraphs: new_para = section.footer.add_paragraph() new_para.style = para.style for run in para.runs: new_run = new_para.add_run(run.text) new_run.bold = run.bold new_run.italic = run.italic new_run.font.size = run.font.size new_run.font.name = run.font.name # 设置页脚与前一节关联,保证页码连续 section.footer.link_to_previous(True)
二、基于Quarto模板的OOXML方案(更彻底)
既然能从Quarto模板提取footer.xml,可以直接修改模板的docx文件,让所有节统一引用该页脚:
- 用WinRAR或7-Zip解压Quarto使用的docx模板,找到
word/document.xml文件 - 编辑
document.xml,定位所有<w:sectPr>(节设置)节点:- 确保每个节的
<w:footerReference>标签指向同一个footer的ID(比如rId10,需与_rels/document.xml.rels里对应footer.xml的ID一致) - 统一设置为
<w:footerReference w:type="default" r:id="rIdXX"/>,XX替换为目标footer的实际ID
- 确保每个节的
- 保存修改后重新打包成docx,作为Quarto的自定义模板使用
这样Quarto生成的文档所有节都会使用同一个页脚,自动包含动态页码。
内容的提问来源于stack exchange,提问作者Selva
相关产品推荐
相关产品推荐

