Удаление примечаний из текстового документа программными средствами
Один из наиболее распространенных сценариев, связанных с текстовыми документами, заключается в очистке документа с целью удаления любых содержащихся в нем личных сведений. Что я подразумеваю под личными сведениями? В первую очередь, я имею в виду примечания, редакции, персональные данные, такие как имя автора и скрытый текст. Этот тип содержимого часто требуется вычистить из документа, прежде чем он будет опубликован за пределами компании.
Этот сценарий настолько важен для программ Office, что в пакете Office 2007 мы добавили новый компонент под названием "Document Inspector", который способен находить и удалять любые личные сведения. Чтобы открыть этот компонент, необходимо нажать кнопку Office и последовательно выбрать "Prepare", "Inspect Document". Вот как выглядит окно инспектора документов:
А как выполнить те же действия программными средствами, скажем, на сервере? Здесь как раз нам может помочь пакет Open XML SDK. Сегодня я собираюсь продемонстрировать процедуру удаления примечаний из текстового документа. Данная запись аналогична записи Эрика по поводу использования LINQ для удаления примечаний из документа с тем отличием, что мое решение будет построено на основе пакета Open XML SDK версии 2.
Документ
Представим себе, что имеется документ, содержащий несколько примечаний, и некоторые из них могут включать изображения. Открыв соответствующий пакет, вы заметите, что в нашем текстовом документе с примечаниями имеется следующее содержимое:
- Документ будет включать раздел примечаний с содержимым каждого примечания.
- Раздел примечаний также может содержать ссылки на другие разделы, связанные с данным примечанием. Например, если примечание содержит изображение, раздел примечаний будет ссылаться на раздел изображений.
- Главный раздел документа будет содержать ссылки на примечания посредством элементов ссылки на примечание.
- Области, связанные с примечаниями, определяются в главном разделе с помощью начального и конечного элементов диапазона примечаний.
На следующем снимке экрана показан пример документа с примечаниями:
Решение
Для удаления примечаний из текстового документа потребуется выполнить следующие действия:
- Открыть текстовый документ с помощью пакета Open XML SDK.
- Получить доступ к главному разделу документа, из которого можно перейти ко всем другим разделам пакета.
- Удалить раздел примечаний и все разделы, на которые в нем имеются ссылки.
- Найти в главном разделе документа все элементы, связанные с примечаниями.
- Удалить все найденные элементы.
- Сохранить изменения документа.
В моей демонстрации будет использоваться пакет 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.