Wyciąg zawartości 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 ramach dokumentu. Treść może jednak składać się ze złożonych elementów, takich jak akapity, tabele, obrazy itp.

Niezależnie od tego, jaką zawartość należy ekstrahować, metoda ekstrakcji tej zawartości zawsze będzie określana przez które węzły są wybierane do ekstrahowania zawartości. Mogą to być całe ciała tekstowe lub proste operacje tekstowe.

Istnieje wiele możliwych sytuacji, a zatem wiele różnych typów węzłów do rozważenia podczas ekstrakcji treści. Na przykład, możesz chcieć wyodrębnić zawartość pomiędzy:

  • Dwa szczegółowe akapity
  • Specyficzny ciąg tekstu
  • Pola różnych typów, takie jak pola łączenia
  • Rozpocznij i zakończ zakresy zakładek lub komentarzy
  • Różne częś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 pobieranie zawartości pomiędzy akapitem a polem, lub pomiędzy biegiem a zakładką.

Ten artykuł zawiera implementację kodu do ekstrakcji tekstu pomiędzy różnymi węzłami, jak również przykłady wspólnych scenariuszy.

Why Extract content

Często celem ekstrakcji treści jest powielenie lub zapisanie jej oddzielnie w nowym dokumencie. Na przykład można pobrać zawartość i:

  • Skopiuj to do oddzielnego dokumentu
  • Konwersja określonej części dokumentu na PDF lub obraz
  • Wielokrotnie kopiuje zawartość dokumentu
  • Praca z ekstrahowaną zawartością oddzielną od reszty dokumentu

Można to łatwo osiągnąć używając Aspose.Words oraz wdrożenie kodu poniżej.

Wyciąganie algorytmu zawartości

Kod w tej sekcji odnosi się do wszystkich możliwych sytuacji opisanych powyżej za pomocą jednej uogólnionej i powtarzalnej metody. Ogólny zarys tej techniki obejmuje:

  1. Gromadzenie węzłów, które dyktują obszar treści, które zostaną wydobyte z dokumentu. Pobieranie tych węzłów jest obsługiwane przez użytkownika w ich kodzie, w oparciu o to, co chcą być ekstrahowane.
  2. Przejście tych węzłów do ExtractContent metoda przedstawiona poniżej. Należy również podać parametr boolean, który określa, czy węzły te, działające jako markery, powinny być włączone do ekstrakcji, czy nie.
  3. Pobieranie listy sklonowanych treści (skopiowanych węzłów), które mają być ekstrahowane. Możesz użyć tej listy węzłów w dowolny sposób, na przykład, tworząc nowy dokument zawierający tylko wybraną zawartość.

Jak wyodrębnić zawartość

Będziemy pracować z dokumentu poniżej w tym artykule. Jak widać zawiera on wiele różnych treści. Uwaga: dokument zawiera drugą sekcję zaczynającą się na środku pierwszej strony. Zakładka i komentarz są również obecne w dokumencie, ale nie są widoczne na ekranie poniżej.

extract-content-aspose-words-java

Aby wyodrębnić zawartość z dokumentu należy zadzwonić ExtractContent metoda poniżej i przekazać odpowiednie parametry.

Podstawą tej metody jest znalezienie węzłów poziomu blokady (akapity i tabele) i klonowanie ich do tworzenia identycznych kopii. Jeśli przepuszczane węzły znacznikowe są block- level, to metoda jest w stanie po prostu skopiować zawartość na tym poziomie i dodać ją do tablicy.

Jeżeli jednak węzły znacznikowe są wtykowe (dziecko akapitu), sytuacja staje się bardziej skomplikowana, ponieważ konieczne jest podzielenie akapitu na węzeł inline, czy to bieganie, zakładki itp. Usuwa się zawartość w sklonowanych węzłach macierzystych niewystępujących pomiędzy znacznikami. Proces ten jest stosowany w celu zapewnienia, że węzły inline nadal zachowują formatowanie punktu macierzystego.

Metoda będzie również przeprowadzać kontrole węzłów przekazywanych jako parametry i rzuca wyjątek, jeśli jeden z węzłów jest nieprawidłowy. Parametry, które należy przekazać tej metodzie, to:

  1. StartNode oraz EndNode. Pierwsze dwa parametry to węzły, które określają, gdzie ma rozpocząć się ekstrakcja zawartości i zakończyć się odpowiednio. Węzły te mogą być obydwoma poziomami bloku (Paragraph , Table ) lub poziom inline (np. Run , FieldStart , BookmarkStart itd.):

    1. Aby przejść przez pole należy przejść odpowiednie FieldStart obiekt.
    2. Aby przekazać zakładki, BookmarkStart oraz BookmarkEnd Należy przejść przez węzły.
    3. Aby przekazać uwagi, CommentRangeStart oraz CommentRangeEnd Należy stosować węzły.
  2. IsInclusive. Określa, czy markery są włączone do ekstrakcji, czy nie. Jeśli ta opcja jest ustawiona na false i ten sam węzeł lub kolejne węzły są przekazywane, następnie zostanie zwrócona pusta lista:

    1. FieldStart node jest przekazywany następnie ta opcja określa, czy całe pole ma być włączone lub wyłączone.
    2. BookmarkStart lub BookmarkEnd node jest przekazywany, ta opcja określa, czy zakładka jest włączona, czy tylko zawartość pomiędzy zakresem zakładek.
    3. CommentRangeStart lub CommentRangeEnd node jest przekazywany, ta opcja określa, czy komentarz ma być włączony, czy tylko zawartość w zakresie komentarzy.

Wdrożenie ExtractContent metody można znaleźć Tutaj. Metoda ta zostanie uwzględniona w scenariuszach zawartych w niniejszym artykule.

Zdefiniujemy również metodę niestandardową, aby łatwo wygenerować dokument z wyciągniętych węzłów. Metoda ta jest stosowana w wielu scenariuszach poniżej i po prostu tworzy nowy dokument i importuje do niego wydobytą zawartość.

Poniższy przykład kodu pokazuje jak wziąć listę węzłów i umieścić je w nowym dokumencie:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
public static Document generateDocument(Document srcDoc, ArrayList<Node> nodes) throws Exception
{
Document dstDoc = new Document();
// Remove the first paragraph from the empty document.
dstDoc.getFirstSection().getBody().removeAllChildren();
// Import each node from the list into the new document. Keep the original formatting of the node.
NodeImporter importer = new NodeImporter(srcDoc, dstDoc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
for (Node node : nodes)
{
Node importNode = importer.importNode(node, true);
dstDoc.getFirstSection().getBody().appendChild(importNode);
}
return dstDoc;
}

Wyciąg zawartości między ustępami

Wskazuje to, w jaki sposób stosować powyższą metodę w celu wyodrębnienia zawartości pomiędzy poszczególnymi akapitami. W tym przypadku chcemy wyodrębnić ciało listu znalezionego w pierwszej połowie dokumentu. Możemy powiedzieć, że jest to między 7 a 11 akapitem.

Poniższy kod realizuje to zadanie. Właściwe ustępy są ekstrahowane z wykorzystaniem getChild metoda na dokumencie i przekazywanie określonych wskaźników. Następnie przenosimy te węzły do ExtractContent metoda i stwierdzenie, że mają one zostać włączone do ekstrakcji. Metoda ta zwróci skopiowaną zawartość pomiędzy tymi węzłami, które następnie zostaną dodane do nowego dokumentu.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość między konkretnymi akapitami za pomocą ExtractContent Metoda powyżej:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Extract content.docx");
Paragraph startPara = (Paragraph) doc.getFirstSection().getBody().getChild(NodeType.PARAGRAPH, 6, true);
Paragraph endPara = (Paragraph) doc.getFirstSection().getBody().getChild(NodeType.PARAGRAPH, 10, true);
// Extract the content between these nodes in the document. Include these markers in the extraction.
ArrayList<Node> extractedNodes = ExtractContentHelper.extractContent(startPara, endPara, true);
Document dstDoc = ExtractContentHelper.generateDocument(doc, extractedNodes);
dstDoc.save(getArtifactsDir() + "ExtractContent.ExtractContentBetweenParagraphs.docx");

Dokument wyjściowy zawiera dwa akapity, które zostały wydobyte.

extract-content-result-aspose-words-java

Wyciąg zawartość między różnymi rodzajami węzłów

Możemy wyodrębnić zawartość pomiędzy dowolnymi kombinacjami węzłów block- level lub inline. W tym scenariuszu poniżej wyodrębnimy treść między akapitem pierwszym a tabelą w sekcji drugiej łącznie. Dostajemy węzły znaczników dzwoniąc getFirstParagraph oraz getChild metoda na drugiej części dokumentu w celu pobrania odpowiedniej Paragraph oraz Table węzły. W przypadku niewielkich zmian powielmy zawartość i wstawimy poniżej oryginału.

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Extract content.docx");
Paragraph startPara = (Paragraph) doc.getLastSection().getChild(NodeType.PARAGRAPH, 2, true);
Table endTable = (Table) doc.getLastSection().getChild(NodeType.TABLE, 0, true);
// Extract the content between these nodes in the document. Include these markers in the extraction.
ArrayList<Node> extractedNodes = ExtractContentHelper.extractContent(startPara, endTable, true);
// Let's reverse the array to make inserting the content back into the document easier.
Collections.reverse(extractedNodes);
for (Node extractedNode : extractedNodes)
// Insert the last node from the reversed list.
endTable.getParentNode().insertAfter(extractedNode, endTable);
doc.save(getArtifactsDir() + "ExtractContent.ExtractContentBetweenBlockLevelNodes.docx");

Poniżej podsumowano treść akapitu i tabeli.

extract-content-between-paragraphs-aspose-words-java

Wyciąg zawartości między ustępami W oparciu o styl

Może być konieczne wyodrębnienie zawartości między akapitami tego samego lub innego stylu, np. między akapitami oznaczonymi stylami nagłówków.

Poniższy kod pokazuje, jak to osiągnąć. Jest to prosty przykład, który wyciąga zawartość między pierwszą instancją stylów “Nagłówek 1” i “Nagłówek 3” bez wyciągania nagłówków. Aby to zrobić, ustawiamy ostatni parametr na false, który określa, że węzły znacznikowe nie powinny być włączone.

W prawidłowym wykonaniu powinno to być prowadzone w pętli w celu wyodrębnienia treści pomiędzy wszystkimi akapitami tych stylów z dokumentu. Wydobyta zawartość jest kopiowana do nowego dokumentu.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość między akapitami z konkretnych stylów za pomocą ExtractContent Metoda:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Extract content.docx");
// Gather a list of the paragraphs using the respective heading styles.
ArrayList<Paragraph> parasStyleHeading1 = paragraphsByStyleName(doc, "Heading 1");
ArrayList<Paragraph> parasStyleHeading3 = paragraphsByStyleName(doc, "Heading 3");
// Use the first instance of the paragraphs with those styles.
Node startPara1 = parasStyleHeading1.get(0);
Node endPara1 = parasStyleHeading3.get(0);
// Extract the content between these nodes in the document. Don't include these markers in the extraction.
ArrayList<Node> extractedNodes = ExtractContentHelper.extractContent(startPara1, endPara1, false);
Document dstDoc = ExtractContentHelper.generateDocument(doc, extractedNodes);
dstDoc.save(getArtifactsDir() + "ExtractContent.ExtractContentBetweenParagraphStyles.docx");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
public static ArrayList<Paragraph> paragraphsByStyleName(Document doc, String styleName)
{
// Create an array to collect paragraphs of the specified style.
ArrayList<Paragraph> paragraphsWithStyle = new ArrayList<Paragraph>();
NodeCollection paragraphs = doc.getChildNodes(NodeType.PARAGRAPH, true);
// Look through all paragraphs to find those with the specified style.
for (Paragraph paragraph : (Iterable<Paragraph>) paragraphs)
{
if (paragraph.getParagraphFormat().getStyle().getName().equals(styleName))
paragraphsWithStyle.add(paragraph);
}
return paragraphsWithStyle;
}

Poniżej przedstawiono wynik poprzedniej operacji.

extract-content-between-paragraph-style-aspose-words-java

Zawartość ekstraktu pomiędzy poszczególnymi biegami

Można pobrać zawartość między węzłami inline, takich jak Run Jak również. Runs z różnych punktów mogą być przekazywane jako markery. Poniższy kod pokazuje jak wyodrębnić określony tekst pomiędzy tymi samymi Paragraph węzeł.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość pomiędzy poszczególnymi ruchami tego samego akapitu za pomocą ExtractContent Metoda:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Extract content.docx");
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 7, true);
Run startRun = para.getRuns().get(1);
Run endRun = para.getRuns().get(4);
// Extract the content between these nodes in the document. Include these markers in the extraction.
ArrayList<Node> extractedNodes = ExtractContentHelper.extractContent(startRun, endRun, true);
for (Node extractedNode : extractedNodes)
System.out.println(extractedNode.toString(SaveFormat.TEXT));

Wyekstrahowany tekst jest wyświetlany na konsoli

extract-content-between-runs-aspose-words-java

Wyciągnij zawartość używając pola

Aby użyć pola jako markera, FieldStart Należy przejść przez węzeł. Ostatni parametr ExtractContent metoda określa, czy całe pole ma być włączone, czy nie. Wyciągnijmy zawartość pomiędzy polem “FullName” a akapitem w dokumencie. Używamy moveToMergeField metody DocumentBuilder Klasa. To zwróci FieldStart węzeł z nazwy pola scalenia przeszedł do niego.

W naszym przypadku ustawmy ostatni parametr przekazywany do ExtractContent metoda false wyłączenie pola z ekstrakcji. Dodamy ekstrahowaną zawartość do PDF.

Poniższy przykład kodu pokazuje, jak wyodrębnić zawartość pomiędzy określonym polem i paragrafem w dokumencie za pomocą ExtractContent Metoda:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Extract content.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
// Pass the first boolean parameter to get the DocumentBuilder to move to the FieldStart of the field.
// We could also get FieldStarts of a field using GetChildNode method as in the other examples.
builder.moveToMergeField("Fullname", false, false);
// The builder cursor should be positioned at the start of the field.
FieldStart startField = (FieldStart) builder.getCurrentNode();
Paragraph endPara = (Paragraph) doc.getFirstSection().getChild(NodeType.PARAGRAPH, 5, true);
// Extract the content between these nodes in the document. Don't include these markers in the extraction.
ArrayList<Node> extractedNodes = ExtractContentHelper.extractContent(startField, endPara, false);
Document dstDoc = ExtractContentHelper.generateDocument(doc, extractedNodes);
dstDoc.save(getArtifactsDir() + "ExtractContent.ExtractContentUsingField.docx");

Wyekstrahowana zawartość pomiędzy polem a akapitem, bez pól i węzłów znaczników paragrafów, które są przekazywane do PDF.

extract-content-using-field-aspose-words-java

Wyciągnij zawartość z zakładki

W dokumencie zawartość, która jest zdefiniowana w zakładce jest zamykana przez BookmarkStart i węzły BookmarkEnd. Zawartość znaleziona pomiędzy tymi dwoma węzłami tworzy zakładkę. Możesz przekazać jeden z tych węzłów jako każdy marker, nawet jeden z różnych zakładek, o ile znacznik początkowy pojawi się przed znacznikiem kończącym w dokumencie.

W naszym przykładowym dokumencie mamy jedną zakładkę o nazwie “Bookmark1”. Zawartość tej zakładki jest podświetlana w naszym dokumencie:

extract-content-from-bookmark-aspose-words-java-1

Wyciągniemy tę zawartość do nowego dokumentu używając poniższego kodu. W IsInclusive opcja parametru pokazuje jak zachować lub wyrzucić zakładkę.

Poniższy przykład kodu pokazuje jak wyodrębnić zawartość, do której odnosi się zakładka ExtractContent Metoda:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Extract content.docx");
Bookmark bookmark = doc.getRange().getBookmarks().get("Bookmark1");
BookmarkStart bookmarkStart = bookmark.getBookmarkStart();
BookmarkEnd bookmarkEnd = bookmark.getBookmarkEnd();
// Firstly, extract the content between these nodes, including the bookmark.
ArrayList<Node> extractedNodesInclusive = ExtractContentHelper.extractContent(bookmarkStart, bookmarkEnd, true);
Document dstDoc = ExtractContentHelper.generateDocument(doc, extractedNodesInclusive);
dstDoc.save(getArtifactsDir() + "ExtractContent.ExtractContentBetweenBookmark.IncludingBookmark.docx");
// Secondly, extract the content between these nodes this time without including the bookmark.
ArrayList<Node> extractedNodesExclusive = ExtractContentHelper.extractContent(bookmarkStart, bookmarkEnd, false);
dstDoc = ExtractContentHelper.generateDocument(doc, extractedNodesExclusive);
dstDoc.save(getArtifactsDir() + "ExtractContent.ExtractContentBetweenBookmark.WithoutBookmark.docx");

Wyjście ekstrahowane z IsInclusive parametr ustawiony na true. Kopia zachowa również zakładkę.

extract-content-from-bookmark-aspose-words-java-2

Wyjście ekstrahowane z IsInclusive parametr ustawiony na false. Kopia zawiera zawartość, ale bez zakładki.

extract-content-from-bookmark-aspose-words-java-3

Wyciąg zawartości z komentarza

Komentarz składa się z węzłów CommentRangeStart, CommentRangeEnd i Comment. Wszystkie węzły są w linii. Pierwsze dwa węzły umieszczają zawartość w dokumencie, do którego odnosi się komentarz, jak widać w poniższym zrzucie ekranu.

W Comment sam węzeł jest InlineStory które mogą zawierać paragrafy i działa. Jest to przesłanie komentarza postrzegane jako bańka komentarza w panelu przeglądu. Ponieważ węzeł ten jest inline i potomkiem ciała można również wydobyć zawartość z wewnątrz tej wiadomości, jak również.

W naszym dokumencie mamy jeden komentarz. Pokażmy to pokazując znaczniki w zakładce Przegląd:

extract-content-from-comment-aspose-words-java-1

Komentarz obejmuje nagłówek, pierwszy akapit oraz tabelę w sekcji drugiej. Wyciągnijmy ten komentarz do nowego dokumentu. W IsInclusive opcja dyktuje, czy komentarz jest przechowywany lub odrzucany.

Poniżej przedstawiono poniższy przykład kodu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Extract content.docx");
CommentRangeStart commentStart = (CommentRangeStart) doc.getChild(NodeType.COMMENT_RANGE_START, 0, true);
CommentRangeEnd commentEnd = (CommentRangeEnd) doc.getChild(NodeType.COMMENT_RANGE_END, 0, true);
// Firstly, extract the content between these nodes including the comment as well.
ArrayList<Node> extractedNodesInclusive = ExtractContentHelper.extractContent(commentStart, commentEnd, true);
Document dstDoc = ExtractContentHelper.generateDocument(doc, extractedNodesInclusive);
dstDoc.save(getArtifactsDir() + "ExtractContent.ExtractContentBetweenCommentRange.IncludingComment.docx");
// Secondly, extract the content between these nodes without the comment.
ArrayList<Node> extractedNodesExclusive = ExtractContentHelper.extractContent(commentStart, commentEnd, false);
dstDoc = ExtractContentHelper.generateDocument(doc, extractedNodesExclusive);
dstDoc.save(getArtifactsDir() + "ExtractContent.ExtractContentBetweenCommentRange.WithoutComment.docx");

Po pierwsze ekstrahowane wyjście z IsInclusive parametr ustawiony na true. Kopia zawiera również komentarz.

extract-content-from-comment-aspose-words-java-2

Po drugie, ekstrahowana produkcja isInclusive ustawiony na false. Kopia zawiera treść, ale bez komentarza.

extract-content-from-comment-aspose-words-java-12

Wyciągnij zawartość używając DocumentVisitor

Aspose.Words może być stosowany nie tylko do tworzenia Microsoft Word dokumenty budując je dynamicznie lub łącząc szablony z danymi, ale również do przetwarzania dokumentów w celu wyodrębnienia oddzielnych elementów dokumentów, takich jak nagłówki, stopki, akapity, tabele, obrazy i inne. Innym możliwym zadaniem jest znalezienie tekstu określonego formatowania lub stylu.

Użyj DocumentVisitor klasy do wdrożenia tego scenariusza użytkowania. Klasa ta odpowiada dobrze znanemu wzorowi projektowemu Odwiedzających. Z DocumentVisitor, można zdefiniować i wykonać niestandardowe operacje, które wymagają wyliczenia nad drzewem dokumentów.

DocumentVisitor zawiera zestaw VisitXXX metody, które są wywoływane przy napotkaniu określonego elementu dokumentu (węzła). Na przykład: VisitParagraphStart jest wywoływany przy odnalezieniu początku akapitu tekstowego oraz VisitParagraphEnd jest wywoływany w momencie znalezienia końca akapitu tekstowego. Każdy DocumentVisitor.VisitXXX metoda akceptuje odpowiedni obiekt, który napotyka, więc można go używać w razie potrzeby (powiedzmy pobrać formatowanie), np. oba VisitParagraphStart oraz VisitParagraphEnd Zaakceptuj Paragraph obiekt.

Każdy DocumentVisitor.VisitXXX metoda zwraca a VisitorAction wartość kontrolująca wyliczenie węzłów. Możesz poprosić o kontynuowanie wyliczania, pominięcie bieżącego węzła (ale kontynuuj wyliczanie) lub zatrzymanie wyliczania węzłów.

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

  • Utwórz klasę pochodzącą z DocumentVisitor.
  • Pominięcie i zapewnić implementacje dla niektórych lub wszystkich DocumentVisitor.VisitXXX metody wykonywania niestandardowych operacji.
  • Call Node.accept na węźle, skąd chcesz zacząć wyliczanie. Na przykład, jeśli chcesz zapisać cały dokument, użyj accept(DocumentVisitor).

DocumentVisitor zapewnia domyślną implementację dla wszystkich DocumentVisitor.VisitXXX metody. Ułatwia to tworzenie nowych dokumentów odwiedzających, ponieważ tylko metody wymagane dla danego odwiedzającego muszą być nadane. Nie jest konieczne lekceważenie wszystkich metod odwiedzających.

Poniższy przykład pokazuje jak używać wzorca Odwiedzający, aby dodać nowe operacje do Aspose.Words model obiektu. W tym przypadku tworzymy prosty konwerter dokumentów w formacie tekstowym:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Extract content.docx");
ConvertDocToTxt convertToPlainText = new ConvertDocToTxt();
// Note that every node in the object model has the accept method so the visiting
// can be executed not only for the whole document, but for any node in the document.
doc.accept(convertToPlainText);
// Once the visiting is complete, we can retrieve the result of the operation,
// That in this example, has accumulated in the visitor.
System.out.println(convertToPlainText.getText());
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
/// <summary>
/// Simple implementation of saving a document in the plain text format. Implemented as a Visitor.
/// </summary>
static class ConvertDocToTxt extends DocumentVisitor {
public ConvertDocToTxt() {
mIsSkipText = false;
mBuilder = new StringBuilder();
}
/// <summary>
/// Gets the plain text of the document that was accumulated by the visitor.
/// </summary>
public String getText() {
return mBuilder.toString();
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
appendText(run.getText());
// Let the visitor continue visiting other nodes.
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
// In Microsoft Word, a field code (such as "MERGEFIELD FieldName") follows
// after a field start character. We want to skip field codes and output field.
// Result only, therefore we use a flag to suspend the output while inside a field code.
// Note this is a very simplistic implementation and will not work very well.
// If you have nested fields in a document.
mIsSkipText = true;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
// Once reached a field separator node, we enable the output because we are
// now entering the field result nodes.
mIsSkipText = false;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
// Make sure we enable the output when reached a field end because some fields
// do not have field separator and do not have field result.
mIsSkipText = false;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Paragraph node is ended in the document.
/// </summary>
public int visitParagraphEnd(Paragraph paragraph) {
// When outputting to plain text we output Cr+Lf characters.
appendText(ControlChar.CR_LF);
return VisitorAction.CONTINUE;
}
public int visitBodyStart(Body body) {
// We can detect beginning and end of all composite nodes such as Section, Body,
// Table, Paragraph etc and provide custom handling for them.
mBuilder.append("*** Body Started ***\r\n");
return VisitorAction.CONTINUE;
}
public int visitBodyEnd(Body body) {
mBuilder.append("*** Body Ended ***\r\n");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a HeaderFooter node is encountered in the document.
/// </summary>
public int visitHeaderFooterStart(HeaderFooter headerFooter) {
// Returning this value from a visitor method causes visiting of this
// Node to stop and move on to visiting the next sibling node
// The net effect in this example is that the text of headers and footers
// Is not included in the resulting output
return VisitorAction.SKIP_THIS_NODE;
}
/// <summary>
/// Adds text to the current output. Honors the enabled/disabled output flag.
/// </summary>
private void appendText(String text) {
if (!mIsSkipText)
mBuilder.append(text);
}
private StringBuilder mBuilder;
private boolean mIsSkipText;
}

Wyciąg tekstu Tylko

Sposoby pobierania tekstu z dokumentu są następujące:

  • Stosowanie Document.save z SaveFormat aby zapisać jako zwykły tekst do pliku lub strumienia
  • Stosowanie Node.toString i przejść SaveFormat.Text parametr. Wewnętrznie, przywołuje zapis jako tekst do strumienia pamięci i zwraca otrzymany ciąg
  • Stosowanie Node.getText aby pobrać tekst ze wszystkimi Microsoft Word znaki kontrolne, w tym kody pól
  • Wdrożenie zwyczaju DocumentVisitor do wykonywania niestandardowych ekstrakcji

Stosowanie Node.GetText oraz Node.ToString

A Dokument Word może zawierać znaki kontrolne, które wyznaczają specjalne elementy, takie jak pole, koniec komórki, koniec sekcji itp. Pełna lista możliwych znaków kontroli słowa jest zdefiniowana w ControlChar Klasa. W GetText metoda zwraca tekst ze wszystkimi znakami znaków sterowania obecnymi w węźle.

Wywołanie ToString zwraca proste przedstawienie tekstu dokumentu tylko bez znaków kontrolnych. Dalsze informacje na temat wywozu w formie zwykłego tekstu znajdują się w: Using SaveFormat.Text.

Poniższy przykład kodu pokazuje różnicę pomiędzy wywołaniem GetText oraz ToString metody na węźle:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertField("MERGEFIELD Field");
// When converted to text it will not retrieve fields code or special characters,
// but will still contain some natural formatting characters such as paragraph markers etc.
// This is the same as "viewing" the document as if it was opened in a text editor.
System.out.println("ToString() Result: " + doc.toString(SaveFormat.TEXT));

Stosowanie SaveFormat.Text

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

  • Filtruje znaki i kody pól, kształt, przypis, notatkę końcową i odniesienia do komentarzy
  • Zastępuje koniec ustępu ControlChar.Cr znaki z ControlChar.CrLf kombinacje
  • Używa kodowania UTF8

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Document.docx");
doc.save(getArtifactsDir() + "BaseConversions.DocxToTxt.txt");

Wyciągnij obrazy z kształtów

Może być konieczne pobranie obrazów dokumentów, aby wykonać niektóre zadania. Aspose.Words pozwala na to również.

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Images.docx");
NodeCollection shapes = doc.getChildNodes(NodeType.SHAPE, true);
int imageIndex = 0;
for (Shape shape : (Iterable<Shape>) shapes) {
if (shape.hasImage()) {
String imageFileName =
MessageFormat.format("Image.ExportImages.{0}_{1}", imageIndex, FileFormatUtil.imageTypeToExtension(shape.getImageData().getImageType()));
// Note, if you have only an image (not a shape with a text and the image),
// you can use shape.getShapeRenderer().save(...) method to save the image.
shape.getImageData().save(getArtifactsDir() + imageFileName);
imageIndex++;
}
}