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

2024-10-03 19:22:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些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”选项未激活时进行注释的情况下运行得非常好。

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

我正在使用win32com.client。我不太熟悉使用word的其他软件包。任何帮助都将不胜感激。
谢谢!你知道吗


Tags: 文件path方法函数文档版本falsedoc
1条回答
网友
1楼 · 发布于 2024-10-03 19:22:39

好吧,所以我可以通过以下方法解决这个问题:

  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

相关问题 更多 >