有没有一种方法可以使用python以编程方式拒绝对Word文档的更改,同时又不从中删除注释?

时间:2019-06-19 12:40:50

标签: python win32com doc

我有一些Word文档(扩展名为'.doc'的Word文档)的旧版本,所有这些文档中都有很多跟踪的更改。大多数更改都有与之相关的注释。

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

我用新版本的word document('。docx'文件)进行了尝试,没有遇到任何问题。所有更改均被拒绝,而单词一词仍然包含所有注释。但是,当我尝试使用旧版本的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)

由于某种原因,该代码几乎可以正常工作。但是,在再次检查了很少的文档后,我发现尽管大多数评论仍然存在,但仍有一些被删除。

我认为,由于注释已被删除,在这种情况下,它们很可能是修订的一部分,因此可以检查修订是否为注释。如果不是,请问有人可以提出一种方法来确保在拒绝更改时不会在文档中删除任何评论。



编辑:
因此,我发现当“跟踪更改”选项处于活动状态时,已删除的注释已添加到文档中。我想它已将评论作为修订的一部分。因此,如果“跟踪更改”选项未激活,则在做出注释的情况下,我的第一个功能运行良好。

但是,那时我大约有二十多个word文档(它们都是doc和docx文件的混合),每个文档至少有十五页和五十多个注释。

我正在使用win32com.client。我对使用MS Word的其他软件包不太熟悉。任何帮助,将不胜感激。
谢谢!

1 个答案:

答案 0 :(得分:0)

好的,因此我可以通过以下方法解决此问题:

  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