有没有一种方法可以使用 python 以编程方式拒绝对 word 文档的更改,同时不删除其中的评论?

Is there a way to programmatically reject changes to a word document using python, while not deleting comments from it?

我有一些旧版本的 word 文档(扩展名为“.doc”的 word 文档),所有这些文档中都有很多跟踪更改。大多数更改都有与之关联的评论。

我需要想出一种方法来使用 python 拒绝文档中所做的所有更改,同时保留注释。

我尝试使用新版本的 word 文档(“.docx”文件)进行此操作,没有遇到任何问题。所有的更改都被拒绝了,word 文档中仍然有所有的评论。但是,当我尝试使用旧版本的 word 文档执行此操作时,我所有的评论都被删除了。

我最初使用以下函数和几个不同版本的 word 文件。

def reject_changes(path):

    doc = word.Documents.Open(path)
    doc.Activate()
    word.ActiveDocument.TrackRevisions = False     
    word.ActiveDocument.Revisions.RejectAll()

    word.ActiveDocument.Save()
    doc.Close(False)
  1. 我试过用原来的word文档使用上面的功能
  2. 我将文件的扩展名更改为“.docx”并尝试了上述功能
  3. 我复制了文档并将其保存为“.docx”格式。

在所有这些情况下,评论都被删除了。

然后我尝试了以下代码:

def reject_changes(path):
    doc = word.Documents.Open(path)
    doc.Activate()
    word.ActiveDocument.TrackRevisions = False
    nextRev = word.Selection.NextRevision()    
    while nextRev:
        nextRev.Reject()
        nextRev = word.Selection.NextRevision()
    word.ActiveDocument.Save()
    doc.Close(False)

出于某种原因,这段代码几乎可以正常工作。但是再次检查了一些文档,我发现虽然大多数评论仍然存在,但仍有一些评论被删除了。

我认为由于评论被删除,它们可能是修订的一部分,在这种情况下,是否可以检查修订是否是评论。如果没有,有人可以建议一种方法来确保文档中拒绝更改的评论不会被删除。



编辑:
因此,我发现当 'Track Changes' 选项处于活动状态时,被删除的评论被添加到文档中。我想它将评论作为修订的一部分。因此,如果 'Track Changes' 选项未激活时进行评论,我的第一个函数就可以很好地工作。

但是,我有大约 20 多个单词的文档(都是 doc 和 docx 文件的混合),每个文档至少有 15 页和超过 50 条评论。

我正在使用 win32com.client。我不太熟悉与 MS word 一起使用的其他包。任何帮助,将不胜感激。
谢谢!

好的,所以我可以通过以下方式找到解决方法:

  1. 正在创建选择对象并选择注释标记的文本范围。
  2. 将注释文本的范围保存到范围对象中。
  3. 拒绝选定文本的修订。
  4. 根据在步骤 2 中创建的范围对象获取新文本。

虽然这种方法会花费很多时间,但提取标记文本的最简单方法是确保在单词未跟踪更改时进行注释。

这是我现在使用的代码。

def reject_changes(path, doc_names):
    word = win32.gencache.EnsureDispatch('Word.Application')
    rejected_changes = []

    for doc in doc_names:
    #open the word document
        wb = word.Documents.Open(rejected_doc)
        wb.Activate()
        current_doc = word.ActiveDocument
        current_doc.TrackRevisions = False

        text = ''

    #iterating over the comments
        for c in current_doc.Comments:
            sentence_range = c.Scope    #returns a range object of the text marked by comment
            select_sentence = sentence_range.Select() #select the sentence marked by sentence_range

            nextRev = word.Selection.NextRevision() #checks for the next revision in word

            while nextRev:
                #if the next revision is not within the sentence_range then skip.
                if nextRev.Range.Start < sentence_range.Start or nextRev.Range.End > sentence_range.End:    
                    break
                else:
                    nextRev.Reject()    
                    new_range = current_doc.Range(sentence_range.Start, sentence_range.End)
                    text = new_range.Text
                nextRev = word.Selection.NextRevision()

            author = c.Author

            rejected_changes.append((doc,author,text,path))
        current_doc.Save()
        wb.Close(False)
    return rejected_changes