【问题标题】:manipulating Microsoft Word DOCX files that have links and track changes using Python使用 Python 操作具有链接和跟踪更改的 Microsoft Word DOCX 文件
【发布时间】:2018-05-31 05:02:32
【问题描述】:

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

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

我已经尝试在 XML 级别执行此操作。例如,这段代码 sn -p 将 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 上打开文件以查看复杂文件时,出现以下错误:

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

我错过了什么?

【问题讨论】:

    标签: ms-word python-docx


    【解决方案1】:

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

    print(doc2.element.xml)
    

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

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

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

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

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

    【讨论】:

    • 嗯。这是个好消息,但让我感到沮丧。我迫切需要做一件事——即合并多个文件中的段落,同时保留更改跟踪。与其将 doc2.element.body 附加到另一个 doc.element.body,不如从 doc2 的 doc2.element.body 中获取所有子级并将它们逐个子级附加到 doc.element 中是否更有意义。身体?
    • 我想值得一试。肯定有一些方法可以破坏文档,但取决于您的内容,它可能会起作用。最有可能搞砸的事情可能是图像和超链接。这两个都引用了必须单独带来的外部项目。请注意,您不能只将新项目附加到 w:body 元素的末尾,“last-child”位置是为 w:sectPr 元素保留的。所以你必须在body[-1] 之前插入它们。文档在这里有更多:python-docx.readthedocs.io/en/latest/dev/analysis/features/…
    • 感谢您的信息。我没有意识到最后一个孩子的位置。我想我最好不要把它复制过来……
    • 啊! cmets 存储在 cmets.xml 中!我真的需要合并 cmets 和更改跟踪。
    • @vy32 你手头有一个具有挑战性的项目:)
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2011-03-19
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多