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

问题描述 投票:1回答:1

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

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

我试过在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上打开复杂文件的文件时,我收到此错误:

enter image description here

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

我错过了什么?

ms-word python-docx
1个回答
1
投票

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

print(doc2.element.xml)

那个元素下面只有一个w:body元素,这是你用doc2.element.body时得到的(.xml也可以用它,顺便说一句,如果你想检查那个元素)。

你的代码正在做的是在另一个w:body元素的末尾附加一个body元素,从而形成无效的XML。 WordprocessingML词汇表对于哪个元素可以跟随另一个元素以及多少个等等非常严格。对我来说唯一的惊喜是它实际上有时适合你,我接受它:)

如果你想直接操作XML,这就是._element属性的用途,你需要仔细考虑(复杂的)WordprocessingML XML Schema。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.