python获取 word 指定段落所在页码?

有word文档(docx),使用python-docx获取到了某个段落,还需要获取段落所在页的页码

要获取段落所在的页码,可以使用Python-docx中的_element属性和_p属性来实现。具体步骤如下,
首先获取段落所在的段落对象,假设为paragraph。

  1. 使用_element属性获取段落对象所在的XML元素对象。

  2. 使用_p属性获取XML元素对象所在的段落对象。

  3. 使用_p对象的part属性获取段落对象所在的Part对象。

  4. 使用Part对象的get_part_of方法获取Part对象所在的Document对象。

  5. 使用Document对象的part属性获取Document对象所在的Part对象。

  6. 使用Part对象的element属性获取Part对象所在的XML元素对象。

  7. 使用XML元素对象的xpath方法获取所有的分页符元素对象。

  8. 遍历所有分页符元素对象,找到包含段落对象的分页符元素对象。

  9. 使用分页符元素对象的getparent方法获取包含分页符元素对象的段落对象。

  10. 使用段落对象的_element属性获取段落对象所在的XML元素对象。

  11. 使用分页符元素对象和段落对象所在的XML元素对象的index属性计算段落所在页的页码。
    下面是实现代码的示例:

from docx.oxml import OxmlElement
from docx.oxml.ns import qn

def get_paragraph_page_number(paragraph):
    # 获取段落对象所在的XML元素对象
    paragraph_element = paragraph._element
    # 获取XML元素对象所在的段落对象
    paragraph = paragraph_element._p
    # 获取段落对象所在的Part对象
    part = paragraph.part
    # 获取Part对象所在的Document对象
    document = part.get_part_of()
    # 获取Document对象所在的Part对象
    part = document.part
    # 获取Part对象所在的XML元素对象
    part_element = part.element
    # 获取所有分页符元素对象
    page_breaks = part_element.xpath('.//w:br[@type="page"]')
    # 遍历分页符元素对象,找到包含段落对象的分页符元素对象
    for page_break in page_breaks:
        if paragraph in page_break.getparent().paragraphs:
            # 获取分页符元素对象和段落对象所在的XML元素对象的index属性
            paragraph_index = paragraph_element.getparent().index(paragraph_element)
            page_break_index = part_element.index(page_break)
            # 计算段落所在页的页码
            page_number = len(part_element[0:page_break_index+1].xpath('.//w:p')) - 1
            page_number += len(page_break.xpath('./preceding::w:p', namespaces={'w': qn('http://schemas.openxmlformats.org/wordprocessingml/2006/main')}))
            return page_number
    return None


  • 这篇博客: 【python-docx 07】使用word样式中的 使用段落特定的样式属性 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 段落样式具有next_paragraph_style属性,该属性指定应用在该段落之后插入的新段落的样式。当样式通常只在序列中出现一次(例如标题)时,这非常有用。在这种情况下,完成标题后,段落样式可以自动设置回主体样式。

    在最常见的情况(正文段落)中,后续段落应该与当前段落具有相同的样式。如果未指定下一个段落样式,则默认情况下通过应用相同样式来处理。

    以下是如何将’标题1’样式的下一个段落样式更改为正文文本的示例:

    from docx import Document
    document = Document()
    styles = document.styles
    
    styles['Heading 1'].next_paragraph_style = styles['Body Text']
    

    通过指定None或样式本身可以恢复默认:

    heading_1_style = styles['Heading 1']
    print(heading_1_style.next_paragraph_style.name)
    # 'Body Text'
    
    heading_1_style.next_paragraph_style = heading_1_style
    print(heading_1_style.next_paragraph_style.name)
    # 'Heading 1'
    
    heading_1_style.next_paragraph_style = None
    print(heading_1_style.next_paragraph_style.name)
    # 'Heading 1'