Extrahovat obsah mezi uzely v dokumentu
Při práci s dokumenty je důležité, aby bylo možné snadno extrahovat obsah z určitého rozsahu v dokumentu. Obsah se však může skládat ze složitých prvků, jako jsou odstavce, tabulky, obrázky atd.
Bez ohledu na to, jaký obsah je třeba extrahovat, metoda extrahování tohoto obsahu bude vždy určena podle toho, které uzly jsou vybrány k získání obsahu mezi. Mohou to být celé textové těla nebo jednoduché textové runy.
Existuje mnoho možných situací, a proto mnoho různých typů uzlů zvážit při získávání obsahu. Například můžete chtít extrahovat obsah mezi:
- Dva konkrétní odstavce
- Specifické průběhy textu
- Pole různých typů, jako například pole sloučení
- Start a konec rozsahu záložky nebo komentář
- Různé části textu obsažené v oddělených sekcích
V některých situacích můžete dokonce potřebovat kombinovat různé typy uzlů, jako je například získávání obsahu mezi odstavcem a polem, nebo mezi spuštěním a záložkou.
Tento článek poskytuje implementaci kódu pro získávání textu mezi různými uzly, stejně jako příklady běžných scénářů.
Proč obsah extraktu
Často je cílem extrakce obsahu duplikovat nebo uložit samostatně v novém dokumentu. Například můžete extrahovat obsah a:
- Zkopírovat do samostatného dokumentu
- Převést určitou část dokumentu na PDF nebo obrázek
- Duplikovat obsah v dokumentu mnohokrát
- Práce s extrahovaným obsahem odděleně od zbytku dokumentu
Toho lze snadno dosáhnout použitím Aspose.Words a provádění kódu níže.
Extrakční obsah Algoritmus
Kód v tomto oddíle se zabývá všemi možnými výše popsanými situacemi jednou zobecněnou metodou a metodou opětovného použití. Obecný obrys této techniky zahrnuje:
- Shromažďování uzlů, které diktují obsah, který bude extrahován z vašeho dokumentu. Získávání těchto uzlů je řízeno uživatelem v jejich kódu, na základě toho, co chtějí být extrahovány.
- Předání těchto uzlů do ExtractContent metoda uvedená níže. Musíte také projít boolean parametr, který uvádí, zda tyto uzly, působící jako markery, by měly být zahrnuty do extrakce nebo ne.
- Získávání seznamu klonovaného obsahu (kopírovaných uzlů), který má být extrahován. Tento seznam uzlů můžete použít jakýmkoli způsobem, například vytvoření nového dokumentu obsahujícího pouze vybraný obsah.
Jak extrahovat obsah
V tomto článku budeme pracovat s níže uvedeným dokumentem. Jak můžete vidět, obsahuje celou řadu obsahu. Dokument také obsahuje druhou část začínající uprostřed první stránky. Záložka a komentář jsou také uvedeny v dokumentu, ale nejsou viditelné v screenshotu níže.
Pro získání obsahu z vašeho dokumentu musíte zavolat ExtractContent
metoda níže a předat příslušné parametry.
Základem této metody je nalezení uzlů na úrovni bloků (odstavce a tabulky) a jejich klonování za účelem vytvoření stejných kopií. Pokud jsou prošlé značkovací uzly blokovou úrovní, pak je metoda schopna jednoduše zkopírovat obsah na této úrovni a přidat jej do pole.
Nicméně, pokud jsou markerové uzly inline (dítě odstavce) pak se situace stává složitější, protože je nutné rozdělit odstavec na inline uzlu, ať už je to běh, záložky pole atd. Obsah klonovaných mateřských uzlů, které nejsou přítomny mezi markery, se odstraní. Tento proces se používá k zajištění toho, aby inline uzly stále zachovaly formátování základního odstavce.
Metoda bude také provádět kontroly uzlů, které prošly jako parametry, a hodit výjimku, pokud je buď uzel neplatný. Parametry, které mají být předány této metodě jsou:
-
StartNode a EndNode. Prvními dvěma parametry jsou uzly, které definují, kde má být extrakce obsahu zahájena a končí. Tyto uzly mohou být oba blokové úrovně (Paragraph , Table ) nebo inline úroveň (např. Run , FieldStart , BookmarkStart atd.:
- Chcete-li projít pole byste měli projít odpovídající FieldStart objekt.
- Chcete-li projít záložky, BookmarkStart a BookmarkEnd Uzel by měl projít.
- Chcete-li předat připomínky, CommentRangeStart a CommentRangeEnd Měly by se používat uzly.
-
IsInclusive. Určuje, zda jsou značky zahrnuty do extrakce nebo nikoli. Pokud je tato volba nastavena false a projdou stejným uzlem nebo po sobě jdoucími uzly, poté bude vrácen prázdný seznam:
- Pokud a FieldStart Uzel je schválen a tato volba definuje, zda má být celé pole zahrnuto nebo vyloučeno.
- Pokud a BookmarkStart nebo BookmarkEnd Uzel je schválen, tato volba definuje, zda je záložka zahrnuta nebo pouze obsah mezi záložek rozsah.
- Pokud a CommentRangeStart nebo CommentRangeEnd Uzel je předán, tato volba definuje, zda má být komentář sám o sobě zahrnut nebo pouze obsah v rozsahu komentáře.
Provádění ExtractContent metoda, kterou můžete najít Tady. Tato metoda bude uvedena ve scénářích uvedených v tomto článku.
Budeme také definovat vlastní metodu snadno generovat dokument z extrahovaných uzlů. Tato metoda se používá v mnoha níže uvedených scénářích a jednoduše vytváří nový dokument a do něj dováží extrahovaný obsah.
Následující příklad kódu ukazuje, jak vzít seznam uzlů a vloží je do nového dokumentu:
// 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; | |
} |
Obsah výpisu mezi odstavci
To ukazuje, jak použít výše uvedenou metodu k získání obsahu mezi konkrétními odstavci. V tomto případě chceme získat tělo dopisu nalezeného v první polovině dokumentu. Můžeme říci, že to je mezi 7. a 11. odstavci.
Tento úkol plní následující kód. Příslušné odstavce jsou extrahovány pomocí getChild metoda na dokumentu a předání stanovených indexů. Pak předáme tyto uzly do ExtractContent metoda a uvést, že tyto jsou zahrnuty do extrakce. Tato metoda vrátí zkopírovaný obsah mezi tyto uzly, které jsou pak vloženy do nového dokumentu.
Následující příklad kódu ukazuje, jak extrahovat obsah mezi konkrétními odstavci pomocí ExtractContent
metoda výše:
// 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"); |
Výstupový dokument obsahuje dva odstavce, které byly extrahovány.
Obsah výpisu mezi různými typy uzlů
Můžeme extrahovat obsah mezi libovolnými kombinacemi blokové nebo inline uzlů. V následujícím scénáři budeme extrahovat obsah mezi prvním odstavcem a tabulkou v druhé části včetně. Dostaneme značkovací uzly voláním getFirstParagraph a getChild metoda na druhém oddíle dokumentu pro získání vhodného Paragraph a Table uzly. Pro mírnou variaci nechť místo toho zdvojí obsah a vloží jej pod originál.
Následující příklad kódu ukazuje, jak extrahovat obsah mezi odstavcem a tabulkou 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"); |
Obsah mezi odstavcem a tabulkou byl duplikován níže je výsledek.
Obsah výpisu mezi odstavci Na základě stylu
Možná budete muset extrahovat obsah mezi odstavci stejného nebo odlišného stylu, například mezi odstavci označenými stylu záhlaví.
Níže uvedený kód ukazuje, jak toho dosáhnout. Jedná se o jednoduchý příklad, který bude extrahovat obsah mezi prvními instancemi hlavice 1 a 1 a 3, bez extrahování čísel. K tomu nastavíme poslední parametr na false, který určuje, že by neměly být zahrnuty značkovací uzly.
Ve správném provedení by to mělo probíhat ve smyčce, aby se z dokumentu získal obsah mezi všemi odstavci těchto stylů. Extrahovaný obsah je zkopírován do nového dokumentu.
Následující příklad kódu ukazuje, jak extrahovat obsah mezi odstavci se specifickými styly 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; | |
} |
Níže je výsledek předchozí operace.
Obsah výpisu mezi konkrétními výsledky
Můžete extrahovat obsah mezi inline uzly, jako je Run Taky. Runs z různých odstavců lze předat jako markery. Níže uvedený kód ukazuje, jak extrahovat konkrétní text mezi stejným Paragraph Uzel.
Následující příklad kódu ukazuje, jak extrahovat obsah mezi konkrétními výsledky stejného odstavce 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)); |
Na konzoli je zobrazen extrahovaný text
Obsah výpisu pomocí pole
Pro použití pole jako značky, FieldStart
Uzel by měl projít. Poslední parametr k ExtractContent
metoda definuje, zda má být celé pole zahrnuto nebo nikoli. Nechť extrahují obsah mezi polem sloučení FullName a odstavcem v dokumentu. Používáme moveToMergeField DocumentBuilder třída. Tohle vrátí FieldStart Uzel od jména pole sloučení přešel na něj.
V našem případě nechť nastavit poslední parametr přešel na ExtractContent metoda false vyloučit pole z těžby. Vytěžíme obsah do PDF.
Následující příklad kódu ukazuje, jak extrahovat obsah mezi určitým polem a odstavcem v dokumentu 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"); |
Extrahovaný obsah mezi polem a odstavcem bez pole a bodových značkovacích uzlů do PDF.
Extrahovat obsah ze záložky
V dokumentu je obsah definovaný v záložce zapouzdřen BookmarkStart
a záložku End uzly. Obsah nalezený mezi těmito dvěma uzly tvoří záložku. Obou z těchto uzlů můžete předat jako jakýkoli marker, a to i ty z různých záložek, pokud se startovní značka objeví před koncovou značkou v dokumentu.
V našem ukázkovém dokumentu máme jednu záložku s názvem “Záložka 1.” Obsah této záložky je zdůrazněn v našem dokumentu:
Tento obsah budeme extrahovat do nového dokumentu pomocí níže uvedeného kódu. The IsInclusive možnost parametru ukazuje, jak záložku uchovávat nebo vyřadit.
Následující příklad kódu ukazuje, jak extrahovat obsah odkazovaný na záložku 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"); | |
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"); |
Extrahovaný výstup s IsInclusive
parametr nastavený na true. Kopie si také ponechá záložku.
Extrahovaný výstup s IsInclusive parametr nastavený na false. Kopie obsahuje obsah, ale bez záložky.
Extrahovat obsah z komentáře
Komentář se skládá z CommentRangeStart, CommentRangeEnd a Komentovat uzly. Všechny tyto uzly jsou inline. První dva uzly zapoutají obsah v dokumentu, na který odkazuje komentář, jak je vidět ve screenshotu níže.
The Comment Uzel sám o sobě je InlineStory který může obsahovat odstavce a běží. Představuje poselství komentáře, jak je vnímáno jako komentační bublina v tabulce recenze. Vzhledem k tomu, že tento uzel je inline a potomek těla můžete také extrahovat obsah zevnitř této zprávy.
V našem dokumentu máme jednu poznámku. Nechť ji zobrazí zobrazením markupu v záložce Review:
V komentáři je uveden nadpis, první odstavec a tabulka ve druhém oddíle. Nechť tuto poznámku extrahují do nového dokumentu. The IsInclusive možnost diktuje, zda je komentář sám o sobě zachován nebo vyřazen.
Následující příklad kódu ukazuje, jak to udělat, je níže:
// 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"); |
Za prvé, extrahovaný výstup s IsInclusive
parametr nastavený na true. Kopie bude obsahovat i komentář.
Za druhé, extrahovaný výstup s isInkluzivní nastaveno na false. Kopie obsahuje obsah, ale bez komentáře.
Obsah výpisu pomocí aplikace DocumentVisitor
Aspose.Words lze použít nejen pro vytváření Microsoft Word dokumenty dynamicky nebo sloučit šablony s daty, ale také pro analýzu dokumentů s cílem získat samostatné prvky dokumentů, jako jsou hlavičky, zápatí, odstavce, tabulky, obrázky a další. Dalším možným úkolem je najít text konkrétního formátování nebo stylu.
Použijte DocumentVisitor třída k provedení tohoto scénáře využití. Tato třída odpovídá známému designu návštěvníka. S DocumentVisitor, můžete definovat a provádět vlastní operace, které vyžadují výčtu nad stromem dokumentu.
DocumentVisitor poskytuje soubor VisitXXX metody, které se používají v případě, že se nachází určitý prvek dokumentu (noda). Například, VisitParagraphStart volá, když je nalezen začátek textového odstavce a VisitParagraphEnd volá, když je nalezen konec textového odstavce. Každý DocumentVisitor.VisitXXX metoda akceptuje odpovídající objekt, na který se setká, takže jej můžete použít podle potřeby (například načíst formátování), např. obojí VisitParagraphStart a VisitParagraphEnd přijmout Paragraph objekt.
Každý DocumentVisitor.VisitXXX metoda vrací a VisitorAction hodnota, která řídí počet uzlů. Můžete požádat buď pokračovat v výčtu, přeskočit aktuální uzel (ale pokračovat v výčtu), nebo zastavit počet uzlů.
Toto jsou kroky, které byste měli sledovat programově určit a extrahovat různé části dokumentu:
- Vytvořit třídu odvozenou od DocumentVisitor.
- Přepsat a poskytnout implementace pro některé nebo všechny DocumentVisitor.VisitXXX metody provádění některých vlastních operací.
- Dorovnávám. Node.accept na uzel, odkud chcete začít s vyjmenováváním. Například, pokud chcete vyčíslit celý dokument, použijte accept(DocumentVisitor).
DocumentVisitor poskytuje výchozí implementace pro všechny DocumentVisitor.VisitXXX metody. Díky tomu je snazší vytvořit nové návštěvníky dokumentů, protože pouze metody potřebné pro konkrétního návštěvníka je třeba přepsat. Není nutné překračovat všechny návštěvnické metody.
Následující příklad ukazuje, jak použít vzor Návštěvníka k přidání nových operací do Aspose.Words model objektu. V tomto případě vytvoříme jednoduchý konvertor dokumentu do textového formátu:
// 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; | |
} |
Text výpisu Pouze
Způsoby, jak získat text z dokumentu jsou:
- Použít Document.save s SaveFormat uložit jako prostý text do souboru nebo streamu
- Použít Node.toString a projít
SaveFormat.Text
parametr. Interně to vyvolá uložení textu do paměti a vrací výsledný řetězec - Použít Node.getText získat text se všemi Microsoft Word kontrolní znaky včetně kódů polí
- Provádět zvyk DocumentVisitor provádět vlastní extrakci
Použití Node.GetText
a Node.ToString
A Slovní dokument může obsahovat kontrolní znaky, které označují zvláštní prvky jako pole, konec buňky, konec sekce atd. Úplný seznam možných znaků kontroly Word je definován v ControlChar třída. The GetText metoda vrací text se všemi znaky ovládacího znaku přítomnými v uzlu.
Volání ToString vrací prostý text reprezentace dokumentu pouze bez kontrolních znaků. Další informace o vývozu jako prostém textu viz Using SaveFormat.Text.
Následující příklad kódu ukazuje rozdíl mezi voláním GetText a ToString metody na uzel:
// 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)); |
Použití SaveFormat.Text
Tento příklad uloží dokument takto:
- Filtruje znaky pole a kódy pole, tvar, poznámka pod čarou, poznámka pod čarou a odkazy na komentář
- nahrazuje konec odstavce ControlChar.Cr Znaky s ControlChar.CrLf kombinace
- Používá kódování UTF8
Následující příklad kódu ukazuje, jak uložit dokument ve formátu 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"); |
Extrahovat obrázky z tvarů
Možná budete potřebovat extrahovat obrazy dokumentů, abyste mohli provádět některé úkoly. Aspose.Words umožňuje vám to také udělat.
Následující příklad kódu ukazuje, jak extrahovat obrázky 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++; | |
} | |
} |