Python docx添加文档页码

文章讲述了在Python的docx库中处理文档时如何为每页添加页码,介绍了两种方法:直接在模板上输入或使用lxml底层API。作者选择后者并提供了详细代码示例,展示了如何通过创建OxmlElement和设置instrText实现页码功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

在使用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方式进行改变。

如果需要在页眉加页码,方式也是同理,至于需要其他格式的页码,相信也不需要笔者多言了。

效果如下:
在这里插入图片描述

在这里插入图片描述

使用 `python-docx` 库本身无法直接获取 Word 文档页码数字,因为该库并不支持解析文档布局或分页信息。然而,可以通过其他方式间接实现这一目标。 ### 使用 `python-docx` 和外部工具配合获取页码 尽管 `python-docx` 不提供内置的方法来提取页码,但可以结合其他技术完成此任务: 1. **通过手动计算页数** 如果需要统计总页数,可以在生成文档时利用 `python-docx` 的段落数量或其他属性估算可能的页面数量[^1]。不过这种方法不够精确,仅适用于简单场景。 2. **借助第三方工具转换 PDF 后再分析** 将 `.docx` 文件另存为 `.pdf` 格式后,可调用像 PyPDF2 这样的 Python 库读取 PDF 中的实际页码数据。以下是具体代码示例: ```python from docx2pdf import convert from PyPDF2 import PdfReader # Step 1: Convert .docx to .pdf (requires installed MS Office or LibreOffice) input_docx_path = 'example.docx' output_pdf_path = 'example.pdf' convert(input_docx_path, output_pdf_path) # Step 2: Read page count using PyPDF2 with open(output_pdf_path, "rb") as pdf_file: reader = PdfReader(pdf_file) num_pages = len(reader.pages) print(f"The document has {num_pages} pages.") ``` 3. **设置并验证页脚中的页码显示** 虽然不能直接抓取已有的页码数值,但是可以用 `python-docx` 插入新的带有编号格式化字符串到每一页底部作为替代方案[^3]。下面展示一段用于向新创建 DOCX 添加连续阿拉伯数字样式页脚的例子: ```python from docx import Document from docx.shared import Pt def create_document_with_page_numbers(doc_name): doc = Document() section = doc.sections[0] footer = section.footer paragraph = footer.paragraphs[0] run = paragraph.add_run("Page ") run.font.size = Pt(8) field_code = "{ PAGE }" fld_simple = r'PAGE \* MERGEFORMAT' run._r.append(field_code_to_xml(fld_simple)) for i in range(5): # Add some content so we have multiple pages. doc.add_heading('Heading %d'%i, level=1) p = doc.add_paragraph('Text on page %d.'%i) doc.save(doc_name) def field_code_to_xml(field_text): """Helper function converting a plain text field code into its XML representation.""" xml = f'<w:fldSimple w:instr="{field_text}" />' return parseXmlString(xml)[0].getchildren()[0] if __name__ == "__main__": create_document_with_page_numbers('./output_with_pagenums.docx') ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值