Есть ли способ программно отклонить изменения в текстовом документе, используя python, не удаляя при этом комментарии? - PullRequest
2 голосов
/ 19 июня 2019

У меня есть старая версия документов из нескольких слов (документ Word с расширением «.doc»), во всех из которых есть много отслеживаемых изменений.С большинством изменений связаны комментарии.

Мне нужно найти способ использовать python для отклонения всех изменений, внесенных в документы, при сохранении комментариев.

Я попробовал это с новыми версиями Word Document (файлы '. Docx') и не столкнулся с какими-либо проблемами.Все изменения были отклонены, и в текстовом документе остались комментарии.Но когда я попытался сделать это с более старыми версиями Word Document, все мои комментарии были удалены.

Сначала я использовал следующую функцию с несколькими различными версиями файла слова.

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. Я пытался использовать вышеуказанную функцию с оригинальным документом слова
  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)

По какой-то причине этот код почти работал.Но, проверив несколько документов еще раз, я обнаружил, что, хотя большинство комментариев осталось, пару из них все же удалили.

Я думаю, что, поскольку комментарии удаляются, они, вероятно, являются частью редакций, в этом случае можно проверить, является ли редакция комментарием или нет.Если нет, то может кто-нибудь предложить способ гарантировать, что в документе не будут удалены комментарии об отклонении изменений.



Редактировать:
Итак, я обнаружил, что комментарии, которыебыли удалены были добавлены в документ, когда была активна опция «Отслеживать изменения».Я предполагаю, что это сделало комментарии как часть пересмотра.Поэтому моя первая функция работает довольно хорошо, если комментарии делаются, когда опция «Отслеживать изменения» не активна.

Но тогда у меня есть более двадцати документов со словами (все они представляют собой смесь документов docx и файлов docx), каждый из которых содержит не менее пятнадцати страниц и более пятидесяти комментариев.

Iиспользую win32com.client.Я не слишком знаком с другими пакетами, которые работают с MS Word.Любая помощь будет оценена.
Спасибо!

1 Ответ

0 голосов
/ 10 июля 2019

Хорошо, я смог обойти это путем:

  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
...