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

Когато работите с документи, е важно да можете лесно да извличате съдържание от определен диапазон в документа. Съдържанието обаче може да се състои от сложни елементи като параграфи, таблици, изображения и т.н.

Независимо от това какво съдържание трябва да бъде извлечено, методът за извличане на това съдържание винаги ще се определя от това кои възли са избрани за извличане на съдържание между. Те могат да бъдат цели текстови тела или прости текстови работи.

Има много възможни ситуации и следователно много различни типове възли, които трябва да се вземат предвид при извличане на съдържание. Например, може да искате да извлечете съдържание между:

  • Два конкретни параграфа
  • Специфични серии от текст
  • Полета от различни видове, като например сливащи се полета
  • Начални и крайни диапазони на отметка или коментар
  • Различни части от текста, съдържащи се в отделни раздели

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

Тази статия предоставя имплементация на код за извличане на текст между различни възли, както и примери за общи сценарии.

Защо Да Извличаме Съдържание

Често целта на извличането на съдържанието е да го дублирате или запишете отделно в нов документ. Например, можете да извличате съдържание и:

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

Това може лесно да се постигне с Aspose.Words и прилагането на кода по-долу.

Алгоритъм За Извличане На Съдържание

Кодът в този раздел разглежда всички възможни ситуации, описани по-горе, с един обобщен и многократно използваем метод. Общото описание на тази техника включва:

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

Как да извличаме съдържание

За да извлечете съдържанието от вашия документ, трябва да се обадите на метода ExtractContent по-долу и да подадете съответните параметри. Основната основа на този метод включва намирането на възли на ниво блок (параграфи и таблици) и клонирането им, за да се създадат идентични копия. Ако преминатите маркерни възли са на блоково ниво, методът може просто да копира съдържанието на това ниво и да го добави към масива.

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

  1. StartNode и EndNode. Първите два параметъра са възлите, които определят къде да започне извличането на съдържанието и да завърши съответно. Тези възли могат да бъдат както на блоково ниво (абзац, таблица), така и на вътрешно ниво (напр.бягане, FieldStart, BookmarkStart и т.н.):

    1. За да подадете поле, трябва да подадете съответния обект FieldStart.
    2. За да се премине отметките, трябва да се преминат възлите BookmarkStart и BookmarkEnd.
    3. За подаване на коментари трябва да се използват възли CommentRangeStart и CommentRangeEnd.
  2. IsInclusive. Определя дали маркерите са включени в екстракцията или не. Ако тази опция е настроена на невярно и са предадени един и същ възел или последователни възли, ще бъде върнат празен списък.:

    1. Ако е подаден възел FieldStart, тази опция определя дали цялото поле трябва да бъде включено или изключено.
    2. Ако е подаден възел BookmarkStart или BookmarkEnd, тази опция определя дали отметката е включена или само съдържанието между диапазона на отметките.
    3. Ако е подаден възел CommentRangeStart или CommentRangeEnd, тази опция определя дали самият коментар трябва да бъде включен или само съдържанието в диапазона на коментара.

Прилагането на ExtractContent метод можете да намерите ето. Този метод ще бъде посочен в сценариите в тази статия.

Също така ще дефинираме персонализиран метод за лесно генериране на документ от извлечени възли. Този метод се използва в много от сценариите по-долу и просто създава нов документ и внася извлеченото съдържание в него.

Следващият пример за код показва как да вземете списък с възли и да ги вмъкнете в нов документ.

Извличане На Съдържание Между Абзаците

Това показва как да използвате метода по-горе, за да извлечете съдържание между конкретни параграфи. В този случай искаме да извлечем тялото на писмото, намерено в първата половина на документа. Можем да кажем, че това е между 7-ми и 11-ти абзац.

Кодът по-долу изпълнява тази задача. Съответните параграфи се извличат, като се използва методът GetChild на документа и се предават посочените индекси. След това предаваме тези възли на метода ExtractContent и заявяваме, че те трябва да бъдат включени в екстракцията. Този метод ще върне копираното съдържание между тези възли, които след това се вмъкват в нов документ.

Следният пример за код показва как да извлечете съдържанието между конкретни параграфи, като използвате метода ExtractContent по-горе:

Извличане на съдържание Между различни видове възли

Можем да извлечем съдържание между всякакви комбинации от блокове или инлайн възли. В този сценарий по-долу ще извлечем съдържанието между първия параграф и таблицата във втория раздел включително. Получаваме възлите на маркерите, като извикаме метода Body.FirstParagraph и GetChild във втория раздел на документа, за да извлечем съответните възли на абзаца и таблицата. За лека вариация нека вместо това да дублираме съдържанието и да го вмъкнем под оригинала.

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

Извличане на съдържание между абзаците въз основа на стила

Може да се наложи да извлечете съдържанието между абзаци от едни и същи или различни стилове, например между абзаци, маркирани със заглавни стилове. Кодът по-долу показва как да се постигне това. Това е прост пример, който ще извлече съдържанието между първата инстанция на стиловете “Heading 1” и “заглавка 3”, без да извлича и заглавията. За да направим това, задаваме последния параметър на невярно, което указва, че маркерните възли не трябва да бъдат включени.

При правилно изпълнение това трябва да се изпълнява в цикъл, за да се извлече съдържание между всички параграфи на тези стилове от документа. Извлеченото съдържание се копира в нов документ.

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

Извличане На Съдържание Между Конкретни Серии

Можете също така да извличате съдържание между инлайн възли, като Run. Runs от различни параграфи могат да се предават като маркери. Кодът по-долу показва как да извлечете конкретен текст между един и същ Paragraph възел.

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

Извличане на съдържание с помощта на поле

За да се използва поле като маркер, трябва да се премине възелът FieldStart. Последният параметър на метода ExtractContent ще определи дали цялото поле трябва да бъде включено или не. Нека извлечем съдържанието между полето за обединяване “FullName " и абзац в документа. Ние използваме MoveToMergeField метода на DocumentBuilder клас. Това ще върне FieldStart възела от името на полето за обединяване, предадено към него.

В нашия случай нека зададем последния параметър, предаден на метода ExtractContent, за да изключим полето от екстракцията. Ние ще превърнем извлеченото съдържание в PDF.

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

Извличане на съдържание от отметка

В документ Съдържанието, което е дефинирано в отметка, се капсулира от възлите BookmarkStart и BookmarkEnd. Съдържанието, намерено между тези два възела, съставлява отметката. Можете да подавате всеки от тези възли като маркер, дори и такива от различни отметки, стига началният маркер да се показва преди крайния маркер в документа. Ще извлечем това съдържание в нов документ, като използваме кода по-долу. Опцията IsInclusive параметър показва как да запазите или отхвърлите отметката.

Следващият пример за код показва как да извлечете съдържанието, свързано с отметка, като използвате метода ExtractContent:

Извличане на съдържание от коментар

Коментарът се състои от възли CommentRangeStart, CommentRangeEnd и коментар. Всички тези възли са вградени. Първите два възела капсулират съдържанието в документа, към който се отнася коментарът, както се вижда на екранната снимка по-долу.

Самият възел Comment е InlineStory, който може да съдържа абзаци и да се изпълнява. Тя представлява съобщението на коментара, както се вижда като коментар балон в екрана за визуализация. Тъй като този възел е инлайн и потомък на тяло, можете също да извлечете съдържанието от това съобщение.

Коментарът съдържа заглавието, първия параграф и таблицата във втория раздел. Нека извлечем този коментар в нов документ. Опцията IsInclusive диктува дали коментарът да бъде запазен или отхвърлен.

Следващият пример за код показва как да направите това:

Как да извлечете съдържание, като използвате DocumentVisitor

Използвайте клас DocumentVisitor, за да реализирате този сценарий на използване. Този клас съответства на добре познатия дизайн на посетителите. С DocumentVisitor, можете да дефинирате и изпълнявате персонализирани операции, които изискват изброяване върху дървото на документа.

DocumentVisitor

Всеки метод DocumentVisitor.VisitXXX връща VisitorAction стойност, която контролира изброяването на възли. Можете да поискате или да продължите изброяването, да пропуснете текущия възел (но да продължите изброяването), или да спрете изброяването на възли.

Това са стъпките, които трябва да следвате, за да определите и извлечете програмно различни части от документ.:

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

DocumentVisitor

Този пример показва как да използвате Посетителския модел, за да добавите нови операции към обектния модел Aspose.Words. В този случай създаваме прост конвертор на документи в текстов формат:

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

Начините за извличане на текст от документа са::

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

Използване на Node.GetText и Node.ToString

Документ Word може да съдържа контролни знаци, които обозначават специални елементи като поле, край на клетката, край на секция и т.н. Пълният списък на възможните Word контролни знаци е дефиниран в класа ControlChar. Методът Node.GetText връща текст с всички контролни символи, присъстващи във възела.

Извикване ToString връща обикновен текстово представяне на документа само без контролни знаци.

Следващият пример за код показва разликата между извикването на методи GetText и ToString на възел:

Употреба SaveFormat.Text

Този пример записва документа, както следва:

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

Следващият пример за код показва как да запишете документ във формат TXT:

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

Може да се наложи да извлечете изображения на документи, за да изпълните някои задачи. Aspose.Words ви позволява да направите това, както добре.

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