Wyodrębnij zawartość między węzłami w dokumencie

Podczas pracy z dokumentami ważne jest, aby móc łatwo wyodrębnić zawartość z określonego zakresu w dokumencie. Jednak treść może składać się ze złożonych elementów, takich jak akapity, tabele, obrazy itp.

Niezależnie od tego, jaką zawartość należy wyodrębnić, metoda wyodrębniania tej zawartości będzie zawsze określana przez węzły, które mają wyodrębnić zawartość między nimi. Mogą to być całe bryły tekstu lub proste przebiegi tekstu.

Istnieje wiele możliwych sytuacji, a zatem wiele różnych typów węzłów, które należy wziąć pod uwagę podczas wyodrębniania zawartości. Na przykład możesz chcieć wyodrębnić zawartość między:

  • Dwa konkretne akapity
  • Konkretne przebiegi tekstu
  • Pola różnych typów, takie jak pola scalania
  • Zakresy początkowe i końcowe zakładki lub komentarza
  • Różne treści tekstu zawarte w oddzielnych sekcjach

W niektórych sytuacjach może być nawet konieczne połączenie różnych typów węzłów, takich jak wyodrębnianie zawartości między akapitem a polem lub między uruchomieniem a zakładką.

Ten artykuł zawiera implementację kodu do wyodrębniania tekstu między różnymi węzłami, a także przykłady typowych scenariuszy.

Po Co Wyodrębniać Zawartość

Często celem wyodrębnienia treści jest zduplikowanie lub zapisanie jej osobno w nowym dokumencie. Na przykład możesz wyodrębnić zawartość i:

  • Skopiuj go do osobnego dokumentu
  • Konwertuj określoną część dokumentu na PDF lub obraz
  • Wielokrotne powielanie treści w dokumencie
  • Praca z wyodrębnioną treścią oddzieloną od reszty dokumentu

Można to łatwo osiągnąć za pomocą Aspose.Words i poniższej implementacji kodu.

Algorytm Wyodrębniania Treści

Kod w tej sekcji Dotyczy wszystkich możliwych sytuacji opisanych powyżej za pomocą jednej uogólnionej i wielokrotnego użytku metody. Ogólny zarys tej techniki obejmuje:

  1. Zbieranie węzłów, które dyktują obszar treści, który zostanie wyodrębniony z dokumentu. Pobieranie tych węzłów jest obsługiwane przez użytkownika w ich kodzie, na podstawie tego, co chcą wyodrębnić.
  2. Przekazywanie tych węzłów do metody ExtractContent podanej poniżej. Musisz również przekazać parametr logiczny, który określa, czy te węzły, działające jako znaczniki, powinny być uwzględnione w ekstrakcji, czy nie.
  3. Pobieranie listy sklonowanej zawartości (skopiowanych węzłów) określonej do wyodrębnienia. Możesz użyć tej listy węzłów w dowolny odpowiedni sposób, na przykład tworząc nowy dokument zawierający tylko wybraną zawartość.

Jak wyodrębnić zawartość

Aby wyodrębnić zawartość z dokumentu, musisz wywołać poniższą metodę ExtractContent i przekazać odpowiednie parametry. Podstawą tej metody jest znalezienie węzłów na poziomie bloku (akapitów i tabel) i klonowanie ich w celu utworzenia identycznych kopii. Jeśli przekazane węzły znaczników są na poziomie bloku, metoda jest w stanie po prostu skopiować zawartość na tym poziomie i dodać ją do tablicy.

Jeśli jednak węzły znaczników są wbudowane (podrzędne akapitu), sytuacja staje się bardziej złożona, ponieważ konieczne jest podzielenie akapitu w węźle wbudowanym, czy to run, pola zakładek itp. Zawartość w sklonowanych węzłach nadrzędnych nieobecnych między znacznikami jest usuwana. Ten proces służy do zapewnienia, że węzły wbudowane nadal zachowają formatowanie akapitu nadrzędnego. Metoda przeprowadzi również kontrole węzłów przekazanych jako parametry i zgłasza wyjątek, jeśli którykolwiek z węzłów jest nieprawidłowy. Parametry, które należy przekazać tej metodzie, to:

  1. StartNode i EndNode. Pierwsze dwa parametry to węzły, które określają, gdzie ekstrakcja zawartości ma się rozpocząć i zakończyć odpowiednio. Węzły te mogą być zarówno na poziomie bloku (akapit, tabela), jak i na poziomie wbudowanym (np. Run, FieldStart, BookmarkStart itp.):

    1. Aby przekazać pole, należy przekazać odpowiedni obiekt FieldStart.
    2. Aby przekazać zakładki, należy przekazać węzły BookmarkStart i BookmarkEnd.
    3. Aby przekazać komentarze, należy użyć węzłów CommentRangeStart i CommentRangeEnd.
  2. IsInclusive. Określa, czy znaczniki są zawarte w ekstrakcji, czy nie. Jeśli ta opcja jest ustawiona na false i przekazywany jest ten sam węzeł lub kolejne węzły, zostanie zwrócona pusta lista:

    1. Jeśli zostanie przekazany węzeł FieldStart, ta opcja określa, czy całe pole ma zostać uwzględnione, czy wykluczone.
    2. Jeśli zostanie przekazany węzeł BookmarkStart LUB BookmarkEnd, Ta opcja określa, czy zakładka jest dołączona, czy tylko zawartość między zakresem zakładek.
    3. Jeśli zostanie przekazany węzeł CommentRangeStart LUB CommentRangeEnd, Ta opcja określa, czy sam komentarz ma zostać uwzględniony, czy tylko zawartość w zakresie komentarzy.

Implementację metody ExtractContent można znaleźć tutaj. Ta metoda zostanie omówiona w scenariuszach w tym artykule.

Zdefiniujemy również niestandardową metodę łatwego generowania dokumentu z wyodrębnionych węzłów. Ta metoda jest używana w wielu poniższych scenariuszach i po prostu tworzy nowy dokument i importuje do niego wyodrębnioną zawartość.

Poniższy przykład kodu pokazuje, jak pobrać listę węzłów i wstawić je do nowego dokumentu.

Wyodrębnij Zawartość Między Akapitami

To pokazuje, jak użyć powyższej metody do wyodrębnienia treści między określonymi akapitami. W takim przypadku chcemy wyodrębnić treść listu znalezionego w pierwszej połowie dokumentu. Możemy powiedzieć, że jest to między 7.a 11. akapitem.

Poniższy kod wykonuje to zadanie. Odpowiednie akapity są wyodrębniane przy użyciu metody GetChild w dokumencie i przekazują określone indeksy. Następnie przekazujemy te węzły do metody ExtractContent i stwierdzamy, że mają one zostać uwzględnione w ekstrakcji. Ta metoda zwróci skopiowaną zawartość między tymi węzłami, które są następnie wstawiane do nowego dokumentu.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość między określonymi akapitami przy użyciu powyższej metody ExtractContent:

Wyodrębnij zawartość między różnymi typami węzłów

Możemy wyodrębnić zawartość między dowolnymi kombinacjami węzłów na poziomie bloku lub wbudowanych. W tym scenariuszu poniżej wyodrębnimy zawartość między pierwszym akapitem a tabelą w drugiej sekcji włącznie. Otrzymujemy węzły znaczników, wywołując metodę Body.FirstParagraph i GetChild w drugiej sekcji dokumentu, aby pobrać odpowiednie węzły akapitu i tabeli. Dla niewielkiej zmiany zamiast tego zduplikujmy zawartość i wstawmy ją poniżej oryginału.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość między akapitem a tabelą za pomocą metody ExtractContent:

Wyodrębnij zawartość między akapitami na podstawie stylu

Może być konieczne wyodrębnienie zawartości między akapitami tego samego lub różnych stylów, na przykład między akapitami oznaczonymi stylami nagłówków. Poniższy kod pokazuje, jak to osiągnąć. Jest to prosty przykład, który wyodrębni zawartość między pierwszą instancją stylów" Heading 1 “i” Header 3 " bez wyodrębniania nagłówków. W tym celu ustawiamy ostatni parametr na false, który określa, że węzły znaczników nie powinny być uwzględniane.

We właściwej implementacji powinno to być uruchamiane w pętli, aby wyodrębnić zawartość między wszystkimi akapitami tych stylów z dokumentu. Wyodrębniona zawartość jest kopiowana do nowego dokumentu.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość między akapitami za pomocą określonych stylów przy użyciu metody ExtractContent:

Wyodrębnij Zawartość Między Określonymi Przebiegami

Możesz także wyodrębnić zawartość między węzłami wbudowanymi, takimi jak Run. Runs z różnych akapitów mogą być przekazywane jako znaczniki. Poniższy kod pokazuje, jak wyodrębnić określony tekst pomiędzy tym samym węzłem Paragraph.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość między określonymi przebiegami tego samego akapitu przy użyciu metody ExtractContent:

Wyodrębnij zawartość za pomocą pola

Aby użyć pola jako znacznika, należy przekazać węzeł FieldStart. Ostatni parametr metody ExtractContent określi, czy całe pole ma zostać uwzględnione, czy nie. Wyodrębnijmy zawartość między polem scalania “FullName " a akapitem w dokumencie. Używamy metody MoveToMergeField klasy DocumentBuilder. Spowoduje to zwrócenie węzła FieldStart z przekazanej do niego nazwy pola scalania.

W naszym przypadku ustawmy ostatni parametr przekazany do metody ExtractContent Na false, aby wykluczyć pole z ekstrakcji. Wyrenderujemy wyodrębnioną zawartość do PDF.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość między określonym polem a akapitem w dokumencie przy użyciu metody ExtractContent:

Wyodrębnij zawartość z zakładki

W dokumencie zawartość zdefiniowana w zakładce jest hermetyzowana przez węzły BookmarkStart i BookmarkEnd. Zawartość znaleziona między tymi dwoma węzłami tworzy zakładkę. Możesz przekazać jeden z tych węzłów jako dowolny znacznik, nawet z różnych zakładek, o ile znacznik początkowy pojawia się przed znacznikiem końcowym w dokumencie. Wyodrębnimy tę zawartość do nowego dokumentu za pomocą poniższego kodu. Opcja parametru IsInclusive pokazuje, jak zachować lub odrzucić zakładkę.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość, do której odwołuje się zakładka przy użyciu metody ExtractContent:

Wyodrębnij treść z komentarza

Komentarz składa się z węzłów CommentRangeStart, CommentRangeEnd i komentarz. Wszystkie te węzły są wbudowane. Pierwsze dwa węzły hermetyzują zawartość dokumentu, do którego odwołuje się komentarz, jak widać na poniższym zrzucie ekranu.

Sam węzeł Comment to InlineStory, który może zawierać akapity i biegi. Reprezentuje wiadomość komentarza jako dymek komentarza w okienku podglądu. Ponieważ ten węzeł jest wbudowany i jest potomkiem ciała, możesz również wyodrębnić zawartość z wnętrza tej wiadomości.

Komentarz zawiera nagłówek, pierwszy akapit i tabelę w drugiej sekcji. Wyodrębnijmy ten komentarz do nowego dokumentu. Opcja IsInclusive określa, czy sam komentarz zostanie zachowany, czy odrzucony.

Poniższy przykład kodu pokazuje, jak to zrobić:

Jak wyodrębnić zawartość za pomocą DocumentVisitor

Użyj klasy DocumentVisitor, aby zaimplementować ten scenariusz użycia. Ta klasa odpowiada dobrze znanemu wzorcowi projektowania odwiedzających. Za pomocą DocumentVisitor, można definiować i wykonywać operacje niestandardowe, które wymagają wyliczenia w drzewie dokumentów.

DocumentVisitor

Każda metoda DocumentVisitor.VisitXXX Zwraca wartość VisitorAction, która kontroluje wyliczenie węzłów. Możesz poprosić o kontynuowanie wyliczania, pominięcie bieżącego węzła (ale kontynuowanie wyliczania) lub zatrzymanie wyliczania węzłów.

Oto kroki, które należy wykonać, aby programowo określić i wyodrębnić różne części dokumentu:

  • Utwórz klasę wywodzącą się z DocumentVisitor
  • Zastąp i zapewnij implementacje dla niektórych lub wszystkich metod DocumentVisitor.VisitXXX w celu wykonania niektórych operacji niestandardowych
  • Wywołaj Node.Accept na węźle, od którego chcesz rozpocząć wyliczenie. Na przykład, jeśli chcesz wyliczyć cały dokument, użyj Document.Accept

DocumentVisitor

Ten przykład pokazuje, jak używać wzorca odwiedzającego do dodawania nowych operacji do modelu obiektowego Aspose.Words. W takim przypadku tworzymy prosty konwerter dokumentów na format tekstowy:

Jak wyodrębnić tylko tekst

Sposoby pobierania tekstu z dokumentu to:

  • Użyj Document.Save z SaveFormat.Text, aby zapisać jako zwykły tekst w pliku lub strumieniu
  • Użyj Node.ToString i przekaż parametr SaveFormat.Text. Wewnętrznie wywołuje to zapisz jako tekst w strumieniu pamięci i zwraca wynikowy ciąg
  • Użyj Node.GetText, aby pobrać tekst ze wszystkimi Microsoft Word znakami kontrolnymi, w tym kodami pól
  • Zaimplementuj Niestandardowy DocumentVisitor, aby wykonać niestandardową ekstrakcję

Używanie Node.GetText i Node.ToString

Dokument Word może zawierać znaki kontrolne, które oznaczają specjalne elementy, takie jak Pole, koniec komórki, koniec sekcji itp. Pełna lista możliwych znaków kontrolnych Word jest zdefiniowana w klasie ControlChar. Metoda Node.GetText zwraca tekst ze wszystkimi znakami kontrolnymi obecnymi w węźle.

Wywołanie ToString zwraca reprezentację zwykłego tekstu dokumentu tylko bez znaków kontrolnych.

Poniższy przykład kodu pokazuje różnicę między wywołaniem metod GetText i ToString w węźle:

Użycie SaveFormat.Text

Ten przykład zapisuje dokument w następujący sposób:

  • Odfiltrowuje znaki pól i kody pól, kształt, Przypisy, przypisy końcowe i odniesienia do komentarzy
  • Zastępuje koniec akapitu ControlChar.Cr znakami ControlChar.CrLf kombinacjami
  • Używa kodowania UTF8

Poniższy przykład kodu pokazuje, jak zapisać dokument w formacie TXT:

Wyodrębnij obrazy z kształtów

Aby wykonać niektóre zadania, może być konieczne wyodrębnienie obrazów dokumentów. Aspose.Words pozwala również na to.

Poniższy przykład kodu pokazuje, jak wyodrębnić obrazy z dokumentu: