使用 Python 操作具有链接和跟踪更改的 Microsoft Word DOCX 文件

manipulating Microsoft Word DOCX files that have links and track changes using Python

我一直在使用优秀的 python-docx 软件包来读取、修改和编写 Microsoft Word 文件。该包支持从每个段落中提取文本。它还允许一次访问一个段落 "run",其中 运行 是一组具有相同字体信息的字符。不幸的是,当您访问 运行s 的段落时,您会丢失链接,因为该包不支持链接。该软件包也不支持访问更改跟踪信息。

我的问题是我需要访问更改跟踪信息。或者,更具体地说,我需要将具有更改跟踪指示的段落从一个文档复制到另一个文档。

我试过在 XML 水平上这样做。例如,此代码片段将 file1.docx 的内容附加到 file2.docx:

from docx import Document
doc1 = Document("file1.docx")
doc2 = Document("file2.docx")
doc2.element.body.append(doc1.element.body)
doc2.save("file2-appended.docx")

当我尝试在 Mac 上打开复杂文件时,出现此错误:

但是如果我点击确定,内容就在那里。对于非常简单的文件,该操作也没有问题。

我错过了什么?

.element 属性实际上是一个 "internal" 接口,应命名为 ._element。在大多数其他地方,我都这样命名。您得到的是文档部分的根元素。你可以通过调用查看它是什么:

print(doc2.element.xml)

该元素下方只有一个 w:body 元素,这就是使用 doc2.element.body 时得到的结果(.xml 也适用于此,顺便说一句,如果您愿意检查该元素)。

您的代码所做的是在另一个 w:body 元素的末尾附加一个正文元素,从而形成无效的 XML。 WordprocessingML 词汇表对于什么元素可以跟在另一个元素之后以及有多少元素等等非常严格。唯一令我惊讶的是,它实际上有时对你有用,我接受了:)

如果您想直接操作 XML,这就是 ._element 属性的用途,鉴于(复杂的)WordprocessingML XML 架构。

与坚持发布的 API 不同,一旦 ._element(或 .element)出现在您的代码中,就没有安全网。

正文内部 XML 可以是与外部文档部分的关系,例如图像和超链接。这些仅在它们出现的文档中有效。这或许可以解释为什么可以修复某些文件。