使用 python-docx 或编辑 document.xml 编辑浮动文本框?

Editing floating textbox using python-docx or editing document.xml?

我正在编辑一个包含大量浮动图像和文本框的 docx 模板。我正在尝试通过 python-docx 或直接编辑 document.xml 来编辑这些文本框。但是,python-docx 的当前迭代似乎只允许编辑内联 "pictures"(在本例中为文本框)。最终目标是要么使用 python-docx 编辑文本框,要么通过访问和编辑 document.xml 来编辑文本框(最好不解压缩然后再压缩备份)

到目前为止,我尝试使用 python-docx 来编辑这些,但根据我的研究,无法使用 python-docx 编辑文本框。

我也尝试过单独编辑 document.xml,我成功地做到了,但是当我试图压缩备份目录并将扩展名改回 docx 时,我无法打开它。

import lxml.etree as ET

xmlfile = r"path\document.xml"

with open(xmlfile) as f:
  tree = ET.parse(f)
  root = tree.getroot()


  for elem in root.getiterator():
    try:
      elem.text = elem.text.replace('current id in document', 'new ID in document')
    except AttributeError:
      pass

tree.write(r"path\documentedit.xml", xml_declaration=True, method='xml')

这是我第一次不使用 python 解压 docx。然后使用 python 编辑 XML。然后我会在不使用 python 的情况下将其压缩,只是为了看看我是否可以让它工作,但我无法打开文档。

在需要 Word 打开的表单中打开和返回一个开放式打包约定 (OPC) 包涉及很多细节。

您可以使用 python-docx 直接访问 XML,同时仍将正确保存(或“re-packaging”)的详细信息留给 python-docx

如果您使用 lxml,您可以使用 document._element 将文档部分的 XML 作为 lxml.etree._Element 对象获取。当您调用 document.save().

时,您对该 XML 树所做的任何更改都将被保存

另一种方法是直接使用 document.part.blob 访问 XML 文本。可以将更改后的版本(作为 Python 2 str/ Python 3 字节)分配给 document.part._blob(注意前导下划线),并在调用 document.save() 时保存。

这样您就不必处理所有复杂的包装问题。