Одновременное согласование документа. Реализация с использованием Aspose.Words

Опубликовано:
15 июня в 09:49
  • 0

В предыдущей статье было рассказано, как можно решить задачу слияния версий документов, используя объектную модель MS Word. 

Эта статья расскажет, как похожую задачу можно решить, используя библиотеку Aspose.Words (библиотека, предоставляющая API для работы с файлами офисных документов форматов ODT, DOCX, RTF, PDF и других).

Библиотека Aspose.Words не обладает методом, позволяющим производить слияние документов (как MergeDocuments в ОМ MS Word). Но в ней есть метод Compare, позволяющий провести сравнение двух документов. 

Приведенный ниже код позволяет провести сравнение двух документов и результат сравнения записать в отдельный файл.

  scriptControl = CreateObject("ScriptControl")
  scriptControl.Language = "VBScript"
  ScriptCode = '
    Function CompareDocs(MainDocPath, ChangedDocPath, FinalDocPath)
      Set Lib = CreateObject("Aspose.Words.ComHelper")
      Set MainDoc = Lib.Open(MainDocPath)
      Set ChangedDoc = Lib.Open(ChangedDocPath)      
      Result = MainDoc.Compare(ChangedDoc, ChangedDoc.BuiltInDocumentProperties.LastSavedBy, Now())   
      MainDoc.Save(FinalDocPath)
    End Function'         
  scriptControl.AddCode(ScriptCode)
  Result = scriptControl.Run("CompareDocs"; MainDocPath; ChangedDocPath; FinalDocPath)
  scriptControl = nil

Для примера сравниваются версии документов двух пользователей (Alex и Peter).  Alex внесла замечания к документу, а Peter замечания и правку. 

Как видно из скриншота, после сравнения в итоговом документе теряются границы словосочетаний, к которым даны комментарии (причем, если к одному и тому же словосочетанию сделаны примечания разными пользователями, то границы не теряются). Техподдержка Aspose ответила, что это является дефектом Aspose.Words (дефект во внутреннем баг-трекере под номером WORDSNET-15320). А еще Aspose слил одинаковые комментарии к одному и тому же слову (слово "word" в последнем предложении) пользователе Alex и Peter в один комментарий.

Кроме указанного выше дефекта есть еще один недостаток. Метод Compare работает только если два документа не содержат не принятых или не отклоненных изменений (ревизий). То есть если попробовать сравнить документ, который получился при сравнении версий Alex и Peter с каким-либо третьим документом, то метод вернет ошибку, так как в документе Alex и Peter есть вставленное слово "Third" и его вставка не подтверждена и не опровергнута.

Aspose предоставляет возможности управлять проведенными исправлениями (можно отвергнуть исправление или принять). Допустим, что текст документа изменять нельзя, а можно только добавлять замечания к тексту. Тогда возможно реализовать следующее. Три пользователя (Alex, Peter и Bob) рецензируют каждый свою копию документа и добавляют свои замечания. После этого проводится поочередное сравнение документов Alex и Peter, при этом все вставленные замечания принимаются, а удаление примечаний отменяется. Затем результат сравнения Alex и Peter сравнивается с документом Bob и снова все вставленные замечания принимаются, а удаление примечаний отменяется. Видоизмененный код для реализации данного алгоритма работы будет выглядеть так:

  scriptControl = CreateObject("ScriptControl")
  scriptControl.Language = "VBScript"
  ScriptCode = '
    Function CompareDocs(MainDocPath, ChangedDocPath, FinalDocPath)
      Set Lib = CreateObject("Aspose.Words.ComHelper")
      Set MainDoc = Lib.Open(MainDocPath)
      Set ChangedDoc = Lib.Open(ChangedDocPath)      
      Result = MainDoc.Compare(ChangedDoc, ChangedDoc.BuiltInDocumentProperties.LastSavedBy, Now()) 
 
      Do While MainDoc.Revisions.Count > 0
        Set Revision = MainDoc.Revisions.Item(MainDoc.Revisions.Count - 1)
        If Revision.RevisionType = 0 Then
          Revision.Accept
        Else  
          Revision.Reject
        End If  
      Loop 

      MainDoc.Save(FinalDocPath)
    End Function'         
  scriptControl.AddCode(ScriptCode)
  Result = scriptControl.Run("CompareDocs"; MainDocPath; ChangedDocPath; FinalDocPath)
  scriptControl = nil

Так, принимая (или отвергая) изменения в документе можно провести сравнение нескольких документов. Это касается изменений не только с замечаниями, но и в тексте документа. Надо только знать, какие изменения нужно принимать, а какие отвергать.

Реализовать слияние изменений можно при помощи Aspose.Words. Минусы в том, что делать это приходится применяя дополнительные алгоритмы (так как в Aspose отсутствует метод, подобный методу MergeDocuments в MS Word), и в наличии описанного выше дефекта, который пока не устранен. Зато работать с документами можно даже при отсутствии офисного пакета. Исчезают недостатки, связанные с нестабильностью работы ОМ MS Word, описанные в предыдущей статье. Также необходимо учесть, что для Aspose.Words необходимо приобретать лицензию.

14
Подписаться

Комментарии

Пока комментариев нет
Авторизуйтесь, чтобы написать комментарий