Python-docx: 如何从 word 文档中删除最后一页

Python-docx: How can I remove last page from a word document

我正在尝试从word文档中删除最后一页,但还没有找到任何解决方案。更准确地说,我想从文档中删除一个部分。

document.sections[-1]

可以用来访问最后一节,但是怎么去掉呢

事实证明,不幸的是,简短的答案似乎是:你不能用 python-docx 做到这一点,至少不能用他们的 API。如果你深入挖掘你的内心,你可能会破解出一些适合你的特定案例的东西。但是在我进行的最后 10-15 分钟的研究中,这似乎是不可能的。

这里有几个问题:

  1. Python-docx 没有页面的概念,参见
  2. 将内容从一个文档复制到另一个文档(或等效地创建一个空文档并将内容复制到其中)非常复杂,通常 python-docx 不支持。参见 combine word document using python docx

虽然从 (2) 中的帖子看来可能有一个替代包可以提供帮助 (https://pypi.org/project/docxcompose/)。

编辑: 这是我得到的。它非常笨拙,但可以进行非常快速的基本测试,尽管我认为它部分损坏了。最后留下了一个空白页。这绝对不能解决问题,但也许可以作为进一步挖掘的起点。

import docx

d = docx.Document('test.docx')
new_doc = docx.Document()

def get_last_page_break(document):
    paragraph_index = 0
    for paragraph in document.paragraphs:
        paragraph_index += 1
        run_index = 0
        for run in paragraph.runs:
            run_index += 1
            if 'lastRenderedPageBreak' in run._element.xml: # soft page break
                lastpara_index = paragraph_index
                lastrun_index = run_index
            elif 'w:br' in run._element.xml and 'type="page"' in run._element.xml: # hard page break
                lastpara_index = paragraph_index
                lastrun_index = run_index
    return lastpara_index, lastrun_index

def kludgy_remove_last_page(document):
    new_doc = docx.Document()
    last_para, lastrun_index = get_last_page_break(d)

    for para in d.paragraphs[:last_para]:
        new_para = new_doc.add_paragraph()
        for run in para.runs[:lastrun_index]:
            new_para.add_run(run.text)
            if 'w:br' in run._element.xml and 'type="page"' in run._element.xml: # hard page break
                new_doc.add_page_break()
    return new_doc

new_doc = kludgy_remove_last_page(d)
new_doc.save('removed.docx')