Удаление примечаний из текстового документа программными средствами

Один из наиболее распространенных сценариев, связанных с текстовыми документами, заключается в очистке документа с целью удаления любых содержащихся в нем личных сведений. Что я подразумеваю под личными сведениями? В первую очередь, я имею в виду примечания, редакции, персональные данные, такие как имя автора и скрытый текст. Этот тип содержимого часто требуется вычистить из документа, прежде чем он будет опубликован за пределами компании.

Этот сценарий настолько важен для программ Office, что в пакете Office 2007 мы добавили новый компонент под названием "Document Inspector", который способен находить и удалять любые личные сведения. Чтобы открыть этот компонент, необходимо нажать кнопку Office и последовательно выбрать "Prepare", "Inspect Document". Вот как выглядит окно инспектора документов:

А как выполнить те же действия программными средствами, скажем, на сервере? Здесь как раз нам может помочь пакет Open XML SDK. Сегодня я собираюсь продемонстрировать процедуру удаления примечаний из текстового документа. Данная запись аналогична записи Эрика по поводу использования LINQ для удаления примечаний из документа с тем отличием, что мое решение будет построено на основе пакета Open XML SDK версии 2.

Документ

Представим себе, что имеется документ, содержащий несколько примечаний, и некоторые из них могут включать изображения. Открыв соответствующий пакет, вы заметите, что в нашем текстовом документе с примечаниями имеется следующее содержимое:

  • Документ будет включать раздел примечаний с содержимым каждого примечания.
  • Раздел примечаний также может содержать ссылки на другие разделы, связанные с данным примечанием. Например, если примечание содержит изображение, раздел примечаний будет ссылаться на раздел изображений.
  • Главный раздел документа будет содержать ссылки на примечания посредством элементов ссылки на примечание.
  • Области, связанные с примечаниями, определяются в главном разделе с помощью начального и конечного элементов диапазона примечаний.

На следующем снимке экрана показан пример документа с примечаниями:

Решение

Для удаления примечаний из текстового документа потребуется выполнить следующие действия:

  1. Открыть текстовый документ с помощью пакета Open XML SDK.
  2. Получить доступ к главному разделу документа, из которого можно перейти ко всем другим разделам пакета.
  3. Удалить раздел примечаний и все разделы, на которые в нем имеются ссылки.
  4. Найти в главном разделе документа все элементы, связанные с примечаниями.
  5. Удалить все найденные элементы.
  6. Сохранить изменения документа.

В моей демонстрации будет использоваться пакет SDK версии 2.

Если вы хотите отслеживать все этапы работы непосредственно по коду, наше решение можно без труда загрузить здесь.

Код

В следующем фрагменте кода реализованы все шесть задач, рассмотренных выше в разделе Решение. В этом коде используются некоторые результаты, полученные в записях Переходы в модели DOM пакета Open XML SDK и Open XML SDK: основные сведения. В частности, для поиска конкретных элементов, связанных с примечаниями, используется метод Descendants(), а для работы с этими элементами — универсальный класс OpenXmlElement. Кроме того, необходимо заметить, что при удалении раздела с помощью пакета Open XML SDK вместе с этим разделом удаляются все разделы, на которые в нем имеются ссылки.

static void RemoveComments(string filename) { //Open up the document using (WordprocessingDocument myDoc = WordprocessingDocument.Open(filename, true)) { //Access main document part MainDocumentPart mainPart = myDoc.MainDocumentPart; //Delete the comment part, plus any other part referenced, like image parts mainPart.DeletePart(mainPart.WordprocessingCommentsPart); //Find all elements that are assoicated with comments IEnumerable<OpenXmlElement> elementList = mainPart.Document.Descendants() .Where(el => el is CommentRangeStart || el is CommentRangeEnd || el is CommentReference); //Delete every found element foreach (OpenXmlElement e in elementList) { e.Remove(); } //Save changes mainPart.Document.Save(); } }

Заключение

Объединив и запустив итоговый код, мы получим документ, полностью очищенный от примечаний. Великолепно!

Взгляните на снимок экрана, на котором показан окончательный документ:

Зияд Раджаби (Zeyad Rajabi)

Это локализованная запись блога. Исходную статью можно найти по адресу https://blogs.msdn.com/brian_jones/archive/2009/02/06/removing-comments-from-a-wordprocessing-document-programmatically.aspx.