Извлечение контента между узлами в документе

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

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

Существует множество возможных ситуаций и, следовательно, множество различных типов узлов, которые следует учитывать при извлечении контента. Например, вы можете извлечь контент между:

  • Два конкретных пункта
  • Конкретные прогоны текста
  • Поля различных типов, такие как поля слияния
  • Стартовый и конечный диапазоны закладки или комментария
  • Различные тексты, содержащиеся в отдельных разделах

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

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

Зачем извлекать контент

Часто целью извлечения контента является дублирование или сохранение его отдельно в новом документе. Например, вы можете извлечь контент и:

  • Копировать его в отдельный документ
  • Преобразование определенной части документа в PDF или изображение
  • многократно дублировать содержание документа
  • Работа с извлеченным контентом отдельно от остальной части документа

Это может быть легко достигнуто с помощью Aspose.Words и реализация кода ниже.

Алгоритм извлечения контента

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

  1. Сбор узлов, которые диктуют область контента, который будет извлечен из вашего документа. Получение этих узлов обрабатывается пользователем в его коде, исходя из того, что он хочет извлечь.
  2. Передача этих узлов в ExtractContent Метод, представленный ниже. Вы также должны пройти булевой параметр, который указывает, должны ли эти узлы, действующие как маркеры, быть включены в экстракцию или нет.
  3. Получение списка клонированного содержимого (копированных узлов), указанного для извлечения. Вы можете использовать этот список узлов любым применимым способом, например, создавая новый документ, содержащий только выбранный контент.

Как извлечь контент

Чтобы извлечь контент из вашего документа, вам нужно позвонить в ExtractContent ниже и пройти соответствующие параметры. Основой этого метода является поиск узлов уровня блоков (параграфов и таблиц) и их клонирование для создания идентичных копий. Если пропускаемые маркерные узлы являются уровнями блоков, то способ может просто скопировать содержимое на этом уровне и добавить его в массив.

Однако если маркерные узлы являются встроенными (ребенок абзаца), то ситуация становится более сложной, так как необходимо разделить абзац на встроенный узел, будь то прогон, поля закладок и т.д. Содержание в клонированных родительских узлах, не присутствующих между маркерами, удаляется. Этот процесс используется для обеспечения того, чтобы встроенные узлы по-прежнему сохраняли форматирование исходного абзаца. Метод также запускает проверки на узлах, прошедших в качестве параметров, и делает исключение, если любой из узлов недействителен. Параметры, которые должны быть переданы этому методу:

  1. StartNode и EndNode. Первые два параметра - это узлы, которые определяют, где начинается и заканчивается извлечение содержимого соответственно. Эти узлы могут быть как на уровне блоков.Paragraph , Table) или рядный уровень (например Run , FieldStart , BookmarkStart и т.д 1.Для прохождения поля необходимо пройти соответствующее FieldStart объект
    1. чтобы передать закладки, BookmarkStart и BookmarkEnd Узлы должны быть пропущены 1.Для передачи комментариев, CommentRangeStart и CommentRangeEnd Узлы должны использоваться
  2. IsInclusive. Определяет, включены ли маркеры в экстракцию или нет. Если эта опция установлена false и один и тот же узел или последовательные узлы проходят, затем возвращается пустой список: 1.Если а FieldStart Узел передается, затем эта опция определяет, должно ли быть включено или исключено все поле 1.Если а BookmarkStart или BookmarkEnd Узел передается, этот вариант определяет, включена ли закладка или только содержимое между диапазоном закладок. 1.Если а CommentRangeStart или CommentRangeEnd Узел передается, этот параметр определяет, должен ли быть включен сам комментарий или только контент в диапазоне комментариев.

Осуществление этого ExtractContent Метод, который вы можете найти на Aspose.Words GitHub. Этот метод будет упомянут в сценариях в этой статье.

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

Следующий пример кода показывает, как взять список узлов и вставить их в новый документ:

Содержание между абзацами

Это показывает, как использовать метод выше для извлечения содержимого между конкретными абзацами. В этом случае мы хотим извлечь тело письма, найденное в первой половине документа. Можно сказать, что это между 7-м и 11-м абзацем.

Приведенный ниже код позволяет выполнить эту задачу. Соответствующие пункты извлекаются с использованием GetChild метод на документе и прохождение указанных индексов. Затем мы передаем эти узлы в ExtractContent Способ и состояние, что они должны быть включены в экстракцию. Этот метод возвращает скопированное содержимое между этими узлами, которые затем вставляются в новый документ.

Следующий пример кода показывает, как извлечь содержимое между конкретными абзацами, используя ExtractContent метод выше:

Извлечение контента между различными типами узлов

Мы можем извлекать контент между любыми комбинациями уровней блоков или встроенных узлов. В этом сценарии ниже мы будем извлекать содержание между первым абзацем и таблицей во втором разделе включительно. Мы получаем узлы маркеров, вызывая FirstParagraph и GetChild методы, описанные во втором разделе документа, для получения соответствующего Paragraph и Table Узлы. Для небольшого изменения давайте вместо этого продублируем контент и вставим его ниже оригинала.

Следующий пример кода показывает, как извлечь содержимое между абзацем и таблицей, используя ExtractContent метод:

Содержание между абзацами Основано на стиле

Вам может потребоваться извлечь содержимое между абзацами одного и того же или другого стиля, например, между абзацами, помеченными стилями заголовков. Приведенный ниже код показывает, как этого добиться. Это простой пример, который будет извлекать содержимое между первым экземпляром стилей “Голова 1” и “Голова 3”, не извлекая заголовки. Для этого мы установили последний параметр false, который указывает, что маркерные узлы не должны быть включены.

В правильной реализации это должно быть запущено в цикле для извлечения содержимого между всеми абзацами этих стилей из документа. Извлеченный контент копируется в новый документ.

Следующий пример кода показывает, как извлекать контент между абзацами с использованием определенных стилей. ExtractContent метод:

Извлечение контента между конкретными пробегами

Вы можете извлекать контент между встроенными узлами, такими как Run И тоже. Runs Из разных абзацев могут быть пропущены как маркеры. В приведенном ниже коде показано, как извлечь конкретный текст между ними. Paragraph Узел.

Следующий пример кода показывает, как извлекать контент между конкретными прогонами одного и того же абзаца, используя ExtractContent метод:

Извлечение контента с помощью поля

Чтобы использовать поле в качестве маркера, FieldStart Узел должен быть пропущен. Последний параметр для ExtractContent Метод определяет, будет ли включено все поле или нет. Выделим содержание между полем слияния “Полное имя” и абзацем в документе. Мы используем MoveToMergeField метод DocumentBuilder класс. Это вернет обратно FieldStart Узел от названия поля слияния перешел к нему.

В нашем случае давайте установим последний параметр, переданный ExtractContent метод для false исключить поле из добычи. Мы переведем извлеченный контент в PDF.

Следующий пример кода показывает, как извлечь содержимое между конкретным полем и абзацем в документе, используя ExtractContent метод:

Извлечение контента из закладки

В документе содержание, которое определено в закладке, инкапсулируется BookmarkStart и узлы BookmarkEnd. Содержание, найденное между этими двумя узлами, составляет закладку. Вы можете передать любой из этих узлов в качестве любого маркера, даже из разных закладок, если начальный маркер появляется перед конечным маркером в документе. Мы будем извлекать этот контент в новый документ, используя код ниже. The IsInclusive Параметр опции показывает, как сохранить или отбросить закладку.

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

Извлечение контента из комментария

Комментарий состоит из узлов CommentRangeStart, CommentRangeEnd и Comment. Все эти узлы являются встроенными. Первые два узла инкапсулируют содержание в документе, на которое ссылается комментарий, как видно на скриншоте ниже.

The Comment Сам по себе узел является InlineStory может содержать абзацы и строки. Он представляет собой сообщение комментария, рассматриваемое как пузырь комментариев в панели обзора. Поскольку этот узел является встроенным и потомком тела, вы также можете извлечь содержимое из этого сообщения.

Комментарий содержит заголовок, первый абзац и таблицу во втором разделе. Давайте добавим этот комментарий в новый документ. The IsInclusive Опция диктует, сохраняется или отбрасывается сам комментарий.

Следующий пример кода показывает, как это сделать:

Как извлечь контент с помощью DocumentVisitor

Используйте DocumentVisitor Класс для реализации этого сценария использования. Этот класс соответствует известному шаблону дизайна посетителя. с DocumentVisitor , Вы можете определять и выполнять пользовательские операции, которые требуют перечисления по дереву документов.

DocumentVisitor Предоставляет набор из VisitXXX Методы, которые используются при встрече с конкретным элементом документа (узлом). Например, VisitParagraphStart Называется, когда найдено начало абзаца текста и VisitParagraphEnd Называется при обнаружении конца текстового абзаца. Каждый DocumentVisitor.VisitXXX метод принимает соответствующий объект, с которым он сталкивается, чтобы вы могли использовать его по мере необходимости (например, восстановить форматирование), например, оба DocumentVisitor.VisitParagraphStart и DocumentVisitor.VisitParagraphEnd принять Paragraph объект.

Каждый DocumentVisitor.VisitXXX Способ возвращает VisitorAction значение, которое контролирует перечисление узлов. Вы можете запросить либо продолжить перечисление, пропустить текущий узел (но продолжить перечисление), либо остановить перечисление узлов.

Вот шаги, которым вы должны следовать, чтобы программно определить и извлечь различные части документа:

  • Создать класс, полученный из DocumentVisitor
  • отменять и обеспечивать реализацию для некоторых или всех DocumentVisitor.VisitXXX Способы выполнения некоторых пользовательских операций
  • Звони. Node.Accept на узле, с которого вы хотите начать перечисление, например, если вы хотите перечислить весь документ, используйте Document.Accept

DocumentVisitor обеспечивает реализацию по умолчанию для всех DocumentVisitor.VisitXXX методы. Это облегчает создание новых посетителей документов, поскольку только методы, необходимые для конкретного посетителя, должны быть отменены. Нет необходимости переопределять все методы посетителей.

Следующий пример показывает, как использовать шаблон посетителя для добавления новых операций в систему. Aspose.Words объектная модель. В этом случае мы создаем простой конвертер документов в текстовый формат:

Как извлечь только текст

Способы извлечения текста из документа:

  • Используйте Document.Save с SaveFormat.Text сохранить как простой текст в файл или поток
  • Используйте Node.ToString и передать SaveFormat.Text параметр. Внутренне это вызывает сохранение в виде текста в поток памяти и возвращает полученную строку
  • Используйте Node.GetText Восстановить текст со всеми Microsoft Word Управляющие символы, включая полевые коды
  • Внедрить обычай DocumentVisitor для выполнения индивидуальной экстракции

Использовать Node.GetText и Node.ToString

А. Документ Word может содержать управляющие символы, которые обозначают специальные элементы, такие как поле, конец ячейки, конец секции и т.д. Полный список возможных символов управления Словом определен в ControlChar класс. The Node.GetText Способ возвращает текст со всеми символами управляющего характера, присутствующими в узле.

Звонить ToString возвращает простое текстовое представление документа только без управляющих символов. Для получения дополнительной информации об экспорте в виде простого текста см. следующий раздел “Использование SaveFormat.Text.

Следующий пример кода показывает разницу между вызовом GetText и ToString методы на узле:

Использовать SaveFormat.Text

Этот пример сохраняет документ следующим образом:

  • Фильтры полевых символов и полевых кодов, формы, сноски, сноски и ссылки на комментарии
  • Заменяет конец пункта ControlChar.Cr персонажей с ControlChar.CrLf комбинации
  • Использование кодирования UTF8

Следующий пример кода показывает, как сохранить документ в формате TXT:

Извлечение изображений из форм

Вам может потребоваться извлечь изображения документов для выполнения некоторых задач. Aspose.Words Это также позволяет вам сделать это.

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