Python-docx: 如何从 word 文档中删除最后一页
Python-docx: How can I remove last page from a word document
我正在尝试从word文档中删除最后一页,但还没有找到任何解决方案。更准确地说,我想从文档中删除一个部分。
document.sections[-1]
可以用来访问最后一节,但是怎么去掉呢
事实证明,不幸的是,简短的答案似乎是:你不能用 python-docx 做到这一点,至少不能用他们的 API。如果你深入挖掘你的内心,你可能会破解出一些适合你的特定案例的东西。但是在我进行的最后 10-15 分钟的研究中,这似乎是不可能的。
这里有几个问题:
- Python-docx 没有页面的概念,参见
- 将内容从一个文档复制到另一个文档(或等效地创建一个空文档并将内容复制到其中)非常复杂,通常 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')
我正在尝试从word文档中删除最后一页,但还没有找到任何解决方案。更准确地说,我想从文档中删除一个部分。
document.sections[-1]
可以用来访问最后一节,但是怎么去掉呢
事实证明,不幸的是,简短的答案似乎是:你不能用 python-docx 做到这一点,至少不能用他们的 API。如果你深入挖掘你的内心,你可能会破解出一些适合你的特定案例的东西。但是在我进行的最后 10-15 分钟的研究中,这似乎是不可能的。
这里有几个问题:
- Python-docx 没有页面的概念,参见
- 将内容从一个文档复制到另一个文档(或等效地创建一个空文档并将内容复制到其中)非常复杂,通常 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')