java.lang.ObjectNode
Inline
SpecialChar
com.aspose.words.AbsolutePositionTab
public class AbsolutePositionTab
Example:
public void documentToTxt() throws Exception {
// This document contains two sentences separated by an absolute position tab
Document doc = new Document(getMyDir() + "Absolute position tab.docx");
// An AbsolutePositionTab is a child node of a paragraph
// AbsolutePositionTabs get picked up when looking for nodes of the SpecialChar type
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
AbsolutePositionTab absPositionTab = (AbsolutePositionTab) para.getChild(NodeType.SPECIAL_CHAR, 0, true);
// This implementation of the DocumentVisitor pattern converts the document to plain text
DocToTxtWriter myDocToTxtWriter = new DocToTxtWriter();
// We can run the DocumentVisitor over the whole first paragraph
para.accept(myDocToTxtWriter);
// A tab character is placed where the AbsolutePositionTab was found
Assert.assertEquals(myDocToTxtWriter.getText(), "Before AbsolutePositionTab\tAfter AbsolutePositionTab");
// An AbsolutePositionTab can accept a DocumentVisitor by itself too
myDocToTxtWriter = new DocToTxtWriter();
absPositionTab.accept(myDocToTxtWriter);
Assert.assertEquals(myDocToTxtWriter.getText(), "\t");
}
/// <summary>
/// Visitor implementation that simply collects the Runs and AbsolutePositionTabs of a document as plain text.
/// </summary>
public static class DocToTxtWriter extends DocumentVisitor {
public DocToTxtWriter() {
mBuilder = new StringBuilder();
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(final Run run) {
appendText(run.getText());
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when an AbsolutePositionTab node is encountered in the document.
/// </summary>
public int visitAbsolutePositionTab(final AbsolutePositionTab tab) {
// We'll treat the AbsolutePositionTab as a regular tab in this case
mBuilder.append("\t");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Adds text to the current output. Honors the enabled/disabled output flag.
/// </summary>
public void appendText(final String text) {
mBuilder.append(text);
}
/// <summary>
/// Gets the plain text of the document that was accumulated by the visitor.
/// </summary>
public String getText() {
return mBuilder.toString();
}
private StringBuilder mBuilder;
}
Property Getters/Setters Summary | ||
---|---|---|
DocumentBase | getDocument() | → inherited from Node |
Gets the document to which this node belongs. | ||
Font | getFont() | → inherited from Inline |
Provides access to the font formatting of this object. | ||
boolean | isComposite() | → inherited from Node |
Returns true if this node can contain other nodes. | ||
boolean | isDeleteRevision() | → inherited from Inline |
Returns true if this object was deleted in Microsoft Word while change tracking was enabled. | ||
boolean | isFormatRevision() | → inherited from Inline |
Returns true if formatting of the object was changed in Microsoft Word while change tracking was enabled. | ||
boolean | isInsertRevision() | → inherited from Inline |
Returns true if this object was inserted in Microsoft Word while change tracking was enabled. | ||
boolean | isMoveFromRevision() | → inherited from Inline |
Returns true if this object was moved (deleted) in Microsoft Word while change tracking was enabled. | ||
boolean | isMoveToRevision() | → inherited from Inline |
Returns true if this object was moved (inserted) in Microsoft Word while change tracking was enabled. | ||
Node | getNextSibling() | → inherited from Node |
Gets the node immediately following this node. | ||
int | getNodeType() | → inherited from SpecialChar |
Returns NodeType.SpecialChar. The value of the property is NodeType integer constant. | ||
CompositeNode | getParentNode() | → inherited from Node |
Gets the immediate parent of this node. | ||
Paragraph | getParentParagraph() | → inherited from Inline |
Retrieves the parent |
||
Node | getPreviousSibling() | → inherited from Node |
Gets the node immediately preceding this node. | ||
Range | getRange() | → inherited from Node |
Returns a Range object that represents the portion of a document that is contained in this node. |
Method Summary | ||
---|---|---|
boolean | accept(DocumentVisitor visitor) | |
Accepts a visitor. | ||
Node | deepClone(boolean isCloneChildren) | → inherited from Node |
CompositeNode | getAncestor(int ancestorType) | → inherited from Node |
Gets the first ancestor of the specified |
||
CompositeNode | getAncestor(java.lang.Class ancestorType) | → inherited from Node |
Gets the first ancestor of the specified object type. | ||
java.lang.String | getText() | → inherited from SpecialChar |
Gets the special character that this node represents. | ||
Node | nextPreOrder(Node rootNode) | → inherited from Node |
Gets next node according to the pre-order tree traversal algorithm. | ||
Node | previousPreOrder(Node rootNode) | → inherited from Node |
Gets the previous node according to the pre-order tree traversal algorithm. | ||
void | remove() | → inherited from Node |
Removes itself from the parent. | ||
java.lang.String | toString(SaveOptions saveOptions) | → inherited from Node |
Exports the content of the node into a string using the specified save options. | ||
java.lang.String | toString(int saveFormat) | → inherited from Node |
Exports the content of the node into a string in the specified format. |
Property Getters/Setters Detail |
---|
getDocument | → inherited from Node |
public DocumentBase getDocument() |
The node always belongs to a document even if it has just been created and not yet added to the tree, or if it has been removed from the tree.
Example:
Shows that when you create any node, it requires a document that will own the node.// Open a file from disk Document doc = new Document(); // Creating a new node of any type requires a document passed into the constructor Paragraph para = new Paragraph(doc); // The new paragraph node does not yet have a parent System.out.println("Paragraph has no parent node: " + (para.getParentNode() == null)); // But the paragraph node knows its document System.out.println("Both nodes' documents are the same: " + (para.getDocument() == doc)); // The fact that a node always belongs to a document allows us to access and modify // properties that reference the document-wide data such as styles or lists para.getParagraphFormat().setStyleName("Heading 1"); // Now add the paragraph to the main text of the first section doc.getFirstSection().getBody().appendChild(para); // The paragraph node is now a child of the Body node System.out.println("Paragraph has a parent node: " + (para.getParentNode() != null));
getFont | → inherited from Inline |
public Font getFont() |
Example:
Creates a simple document from scratch using the Aspose.Words object model.// Create an "empty" document. Note that like in Microsoft Word, // the empty document has one section, body and one paragraph in it Document doc = new Document(); // This truly makes the document empty. No sections (not possible in Microsoft Word) doc.removeAllChildren(); // Create a new section node // Note that the section has not yet been added to the document, // but we have to specify the parent document Section section = new Section(doc); // Append the section to the document doc.appendChild(section); // Lets set some properties for the section section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE); section.getPageSetup().setPaperSize(PaperSize.LETTER); // The section that we created is empty, lets populate it. The section needs at least the Body node Body body = new Body(doc); section.appendChild(body); // The body needs to have at least one paragraph // Note that the paragraph has not yet been added to the document, // but we have to specify the parent document // The parent document is needed so the paragraph can correctly work // with styles and other document-wide information Paragraph para = new Paragraph(doc); body.appendChild(para); // We can set some formatting for the paragraph para.getParagraphFormat().setStyleName("Heading 1"); para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); // So far we have one empty paragraph in the document // The document is valid and can be saved, but lets add some text before saving // Create a new run of text and add it to our paragraph Run run = new Run(doc); run.setText("Hello World!"); run.getFont().setColor(Color.RED); para.appendChild(run); // As a matter of interest, you can retrieve text of the whole document and // see that \x000c is automatically appended. \x000c is the end of section character System.out.println(doc.getText()); // Save the document doc.save(getArtifactsDir() + "Section.CreateFromScratch.doc");
isComposite | → inherited from Node |
public boolean isComposite() |
Example:
Shows how to efficiently visit all direct and indirect children of a composite node.public void recurseAllNodes() throws Exception { // Open a document Document doc = new Document(getMyDir() + "Document.docx"); // Invoke the recursive function that will walk the tree traverseAllNodes(doc); } /** * A simple function that will walk through all children of a specified node recursively * and print the type of each node to the screen. */ @Test(enabled = false) public void traverseAllNodes(final CompositeNode parentNode) { // This is the most efficient way to loop through immediate children of a node for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) { // Do some useful work System.out.println(Node.nodeTypeToString(childNode.getNodeType())); // Recurse into the node if it is a composite node if (childNode.isComposite()) { traverseAllNodes((CompositeNode) childNode); } } }
isDeleteRevision | → inherited from Inline |
public boolean isDeleteRevision() |
Example:
Shows how to process revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
isFormatRevision | → inherited from Inline |
public boolean isFormatRevision() |
Example:
Shows how to process revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
isInsertRevision | → inherited from Inline |
public boolean isInsertRevision() |
Example:
Shows how to process revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
isMoveFromRevision | → inherited from Inline |
public boolean isMoveFromRevision() |
Example:
Shows how to process revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
isMoveToRevision | → inherited from Inline |
public boolean isMoveToRevision() |
Example:
Shows how to process revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
getNextSibling | → inherited from Node |
public Node getNextSibling() |
Example:
Shows how to enumerate immediate child nodes of a composite node using NextSibling.// In this example we enumerate all paragraphs of a section body // Get the section that we want to work on Section section = doc.getSections().get(0); Body body = section.getBody(); // Loop starting from the first child until we reach null for (Node node = body.getFirstChild(); node != null; node = node.getNextSibling()) { // Output the types of the nodes that we come across System.out.println(Node.nodeTypeToString(node.getNodeType())); }
Example:
Shows how to efficiently visit all direct and indirect children of a composite node.public void recurseAllNodes() throws Exception { // Open a document Document doc = new Document(getMyDir() + "Document.docx"); // Invoke the recursive function that will walk the tree traverseAllNodes(doc); } /** * A simple function that will walk through all children of a specified node recursively * and print the type of each node to the screen. */ @Test(enabled = false) public void traverseAllNodes(final CompositeNode parentNode) { // This is the most efficient way to loop through immediate children of a node for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) { // Do some useful work System.out.println(Node.nodeTypeToString(childNode.getNodeType())); // Recurse into the node if it is a composite node if (childNode.isComposite()) { traverseAllNodes((CompositeNode) childNode); } } }
getNodeType | → inherited from SpecialChar |
public int getNodeType() |
Example:
Shows how to retrieve the NodeType enumeration of nodes.Document doc = new Document(getMyDir() + "Document.docx"); // Let's pick a node that we can't be quite sure of what type it is // In this case lets pick the first node of the first paragraph in the body of the document Node node = doc.getFirstSection().getBody().getFirstParagraph().getFirstChild(); System.out.println("NodeType of first child: " + Node.nodeTypeToString(node.getNodeType())); // This time let's pick a node that we know the type of // Create a new paragraph and a table node Paragraph para = new Paragraph(doc); Table table = new Table(doc); // Access to NodeType for typed nodes will always return their specific NodeType // i.e A paragraph node will always return NodeType.Paragraph, a table node will always return NodeType.Table System.out.println("NodeType of Paragraph: " + Node.nodeTypeToString(para.getNodeType())); System.out.println("NodeType of Table: " + Node.nodeTypeToString(table.getNodeType()));
getParentNode | → inherited from Node |
public CompositeNode getParentNode() |
If a node has just been created and not yet added to the tree, or if it has been removed from the tree, the parent is null.
Example:
Shows how to access the parent node.// Create a new empty document. It has one section Document doc = new Document(); // The section is the first child node of the document Node section = doc.getFirstChild(); // The section's parent node is the document System.out.println("Section parent is the document: " + (doc == section.getParentNode()));
Example:
Shows that when you create any node, it requires a document that will own the node.// Open a file from disk Document doc = new Document(); // Creating a new node of any type requires a document passed into the constructor Paragraph para = new Paragraph(doc); // The new paragraph node does not yet have a parent System.out.println("Paragraph has no parent node: " + (para.getParentNode() == null)); // But the paragraph node knows its document System.out.println("Both nodes' documents are the same: " + (para.getDocument() == doc)); // The fact that a node always belongs to a document allows us to access and modify // properties that reference the document-wide data such as styles or lists para.getParagraphFormat().setStyleName("Heading 1"); // Now add the paragraph to the main text of the first section doc.getFirstSection().getBody().appendChild(para); // The paragraph node is now a child of the Body node System.out.println("Paragraph has a parent node: " + (para.getParentNode() != null));
getParentParagraph | → inherited from Inline |
public Paragraph getParentParagraph() |
Example:
Shows how to process revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
getPreviousSibling | → inherited from Node |
public Node getPreviousSibling() |
Example:
Shows how to use of methods of Node and CompositeNode to remove a section before the last section in the document.// Document is a CompositeNode and LastChild returns the last child node in the Document node // Since the Document can contain only Section nodes, the last child is the last section Node lastSection = doc.getLastChild(); // Each node knows its next and previous sibling nodes // Previous sibling of a section is a section before the specified section // If the node is the first child, PreviousSibling will return null Node sectionBeforeLast = lastSection.getPreviousSibling(); if (sectionBeforeLast != null) { doc.removeChild(sectionBeforeLast); }
getRange | → inherited from Node |
public Range getRange() |
Example:
Shows how to delete all characters of a range.// Insert two sections into a blank document Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.write("Section 1. "); builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS); builder.write("Section 2."); // Verify the whole text of the document Assert.assertEquals("Section 1. \fSection 2.", doc.getText().trim()); // Delete the first section from the document doc.getSections().get(0).getRange().delete(); // Check the first section was deleted by looking at the text of the whole document again Assert.assertEquals("Section 2.", doc.getText().trim());
Method Detail |
---|
accept | |
public boolean accept(DocumentVisitor visitor) throws java.lang.Exception |
Calls DocumentVisitor.VisitAbsolutePositionTab.
For more info see the Visitor design pattern.
visitor
- The visitor that will visit the node.Example:
Shows how to work with AbsolutePositionTab.public void documentToTxt() throws Exception { // This document contains two sentences separated by an absolute position tab Document doc = new Document(getMyDir() + "Absolute position tab.docx"); // An AbsolutePositionTab is a child node of a paragraph // AbsolutePositionTabs get picked up when looking for nodes of the SpecialChar type Paragraph para = doc.getFirstSection().getBody().getFirstParagraph(); AbsolutePositionTab absPositionTab = (AbsolutePositionTab) para.getChild(NodeType.SPECIAL_CHAR, 0, true); // This implementation of the DocumentVisitor pattern converts the document to plain text DocToTxtWriter myDocToTxtWriter = new DocToTxtWriter(); // We can run the DocumentVisitor over the whole first paragraph para.accept(myDocToTxtWriter); // A tab character is placed where the AbsolutePositionTab was found Assert.assertEquals(myDocToTxtWriter.getText(), "Before AbsolutePositionTab\tAfter AbsolutePositionTab"); // An AbsolutePositionTab can accept a DocumentVisitor by itself too myDocToTxtWriter = new DocToTxtWriter(); absPositionTab.accept(myDocToTxtWriter); Assert.assertEquals(myDocToTxtWriter.getText(), "\t"); } /// <summary> /// Visitor implementation that simply collects the Runs and AbsolutePositionTabs of a document as plain text. /// </summary> public static class DocToTxtWriter extends DocumentVisitor { public DocToTxtWriter() { mBuilder = new StringBuilder(); } /// <summary> /// Called when a Run node is encountered in the document. /// </summary> public int visitRun(final Run run) { appendText(run.getText()); // Let the visitor continue visiting other nodes return VisitorAction.CONTINUE; } /// <summary> /// Called when an AbsolutePositionTab node is encountered in the document. /// </summary> public int visitAbsolutePositionTab(final AbsolutePositionTab tab) { // We'll treat the AbsolutePositionTab as a regular tab in this case mBuilder.append("\t"); return VisitorAction.CONTINUE; } /// <summary> /// Adds text to the current output. Honors the enabled/disabled output flag. /// </summary> public void appendText(final String text) { mBuilder.append(text); } /// <summary> /// Gets the plain text of the document that was accumulated by the visitor. /// </summary> public String getText() { return mBuilder.toString(); } private StringBuilder mBuilder; }
deepClone | → inherited from Node |
public Node deepClone(boolean isCloneChildren) |
Example:
Shows how to clone composite nodes with and without their child nodes.// Create a new empty document Document doc = new Document(); // Add some text to the first paragraph Paragraph para = doc.getFirstSection().getBody().getFirstParagraph(); para.appendChild(new Run(doc, "Some text")); // Clone the paragraph and the child nodes Node cloneWithChildren = para.deepClone(true); // Only clone the paragraph and no child nodes Node cloneWithoutChildren = para.deepClone(false);
getAncestor | → inherited from Node |
public CompositeNode getAncestor(int ancestorType) |
ancestorType
- A Example:
Shows how to find out if a table contains another table or if the table itself is nested inside another table.public void calculateDepthOfNestedTables() throws Exception { Document doc = new Document(getMyDir() + "Nested tables.docx"); int tableIndex = 0; for (Table table : (Iterable<Table>) doc.getChildNodes(NodeType.TABLE, true)) { // First lets find if any cells in the table have tables themselves as children int count = getChildTableCount(table); System.out.println(MessageFormat.format("Table #{0} has {1} tables directly within its cells", tableIndex, count)); // Now let's try the other way around, lets try find if the table is nested inside another table and at what depth int tableDepth = getNestedDepthOfTable(table); if (tableDepth > 0) { System.out.println(MessageFormat.format("Table #{0} is nested inside another table at depth of {1}", tableIndex, tableDepth)); } else { System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", tableIndex)); } tableIndex++; } } /** * Calculates what level a table is nested inside other tables. * * @returns An integer containing the level the table is nested at. * 0 = Table is not nested inside any other table * 1 = Table is nested within one parent table * 2 = Table is nested within two parent tables etc.. */ private static int getNestedDepthOfTable(final Table table) { int depth = 0; int type = table.getNodeType(); // The parent of the table will be a Cell, instead attempt to find a grandparent that is of type Table Node parent = table.getAncestor(table.getNodeType()); while (parent != null) { // Every time we find a table a level up we increase the depth counter and then try to find an // ancestor of type table from the parent depth++; parent = parent.getAncestor(Table.class); } return depth; } /** * Determines if a table contains any immediate child table within its cells. * Does not recursively traverse through those tables to check for further tables. * * @returns Returns true if at least one child cell contains a table. * Returns false if no cells in the table contains a table. */ private static int getChildTableCount(final Table table) { int tableCount = 0; // Iterate through all child rows in the table for (Row row : table.getRows()) { // Iterate through all child cells in the row for (Cell cell : row.getCells()) { // Retrieve the collection of child tables of this cell TableCollection childTables = cell.getTables(); // If this cell has a table as a child then return true if (childTables.getCount() > 0) tableCount++; } } // No cell contains a table return tableCount; }
getAncestor | → inherited from Node |
public CompositeNode getAncestor(java.lang.Class ancestorType) |
The ancestor type matches if it is equal to ancestorType or derived from ancestorType.
ancestorType
- The object type of the ancestor to retrieve.Example:
Shows how to find out if a table contains another table or if the table itself is nested inside another table.public void calculateDepthOfNestedTables() throws Exception { Document doc = new Document(getMyDir() + "Nested tables.docx"); int tableIndex = 0; for (Table table : (Iterable<Table>) doc.getChildNodes(NodeType.TABLE, true)) { // First lets find if any cells in the table have tables themselves as children int count = getChildTableCount(table); System.out.println(MessageFormat.format("Table #{0} has {1} tables directly within its cells", tableIndex, count)); // Now let's try the other way around, lets try find if the table is nested inside another table and at what depth int tableDepth = getNestedDepthOfTable(table); if (tableDepth > 0) { System.out.println(MessageFormat.format("Table #{0} is nested inside another table at depth of {1}", tableIndex, tableDepth)); } else { System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", tableIndex)); } tableIndex++; } } /** * Calculates what level a table is nested inside other tables. * * @returns An integer containing the level the table is nested at. * 0 = Table is not nested inside any other table * 1 = Table is nested within one parent table * 2 = Table is nested within two parent tables etc.. */ private static int getNestedDepthOfTable(final Table table) { int depth = 0; int type = table.getNodeType(); // The parent of the table will be a Cell, instead attempt to find a grandparent that is of type Table Node parent = table.getAncestor(table.getNodeType()); while (parent != null) { // Every time we find a table a level up we increase the depth counter and then try to find an // ancestor of type table from the parent depth++; parent = parent.getAncestor(Table.class); } return depth; } /** * Determines if a table contains any immediate child table within its cells. * Does not recursively traverse through those tables to check for further tables. * * @returns Returns true if at least one child cell contains a table. * Returns false if no cells in the table contains a table. */ private static int getChildTableCount(final Table table) { int tableCount = 0; // Iterate through all child rows in the table for (Row row : table.getRows()) { // Iterate through all child cells in the row for (Cell cell : row.getCells()) { // Retrieve the collection of child tables of this cell TableCollection childTables = cell.getTables(); // If this cell has a table as a child then return true if (childTables.getCount() > 0) tableCount++; } } // No cell contains a table return tableCount; }
getText | → inherited from SpecialChar |
public java.lang.String getText() |
nextPreOrder | → inherited from Node |
public Node nextPreOrder(Node rootNode) |
rootNode
- The top node (limit) of traversal.Example:
Shows how to delete all images from a document using pre-order tree traversal.Document doc = new Document(getMyDir() + "Images.docx"); Assert.assertEquals(doc.getChildNodes(NodeType.SHAPE, true).getCount(), 10); Node curNode = doc; while (curNode != null) { Node nextNode = curNode.nextPreOrder(doc); if (curNode.previousPreOrder(doc) != null && nextNode != null) { Assert.assertEquals(curNode, nextNode.previousPreOrder(doc)); } if (curNode.getNodeType() == NodeType.SHAPE) { Shape shape = (Shape) curNode; // Several shape types can have an image including image shapes and OLE objects if (shape.hasImage()) { shape.remove(); } } curNode = nextNode; } Assert.assertEquals(1, doc.getChildNodes(NodeType.SHAPE, true).getCount()); doc.save(getArtifactsDir() + "Image.DeleteAllImagesPreOrder.docx");
previousPreOrder | → inherited from Node |
public Node previousPreOrder(Node rootNode) |
rootNode
- The top node (limit) of traversal.Example:
Shows how to delete all images from a document using pre-order tree traversal.Document doc = new Document(getMyDir() + "Images.docx"); Assert.assertEquals(doc.getChildNodes(NodeType.SHAPE, true).getCount(), 10); Node curNode = doc; while (curNode != null) { Node nextNode = curNode.nextPreOrder(doc); if (curNode.previousPreOrder(doc) != null && nextNode != null) { Assert.assertEquals(curNode, nextNode.previousPreOrder(doc)); } if (curNode.getNodeType() == NodeType.SHAPE) { Shape shape = (Shape) curNode; // Several shape types can have an image including image shapes and OLE objects if (shape.hasImage()) { shape.remove(); } } curNode = nextNode; } Assert.assertEquals(1, doc.getChildNodes(NodeType.SHAPE, true).getCount()); doc.save(getArtifactsDir() + "Image.DeleteAllImagesPreOrder.docx");
remove | → inherited from Node |
public void remove() |
Example:
Shows how to delete all images from a document.Document doc = new Document(getMyDir() + "Images.docx"); Assert.assertEquals(doc.getChildNodes(NodeType.SHAPE, true).getCount(), 10); // Here we get all shapes from the document node, but you can do this for any smaller // node too, for example delete shapes from a single section or a paragraph NodeCollection shapes = doc.getChildNodes(NodeType.SHAPE, true); // We cannot delete shape nodes while we enumerate through the collection // One solution is to add nodes that we want to delete to a temporary array and delete afterwards ArrayList shapesToDelete = new ArrayList(); for (Shape shape : (Iterable<Shape>) shapes) { // Several shape types can have an image including image shapes and OLE objects if (shape.hasImage()) { shapesToDelete.add(shape); } } // Now we can delete shapes for (Shape shape : (Iterable<Shape>) shapesToDelete) { shape.remove(); } Assert.assertEquals(1, doc.getChildNodes(NodeType.SHAPE, true).getCount()); doc.save(getArtifactsDir() + "Image.DeleteAllImages.docx");
Example:
Shows how to remove all nodes of a specific type from a composite node.// In this example we remove tables from a section body // Get the section that we want to work on Section section = doc.getSections().get(0); Body body = section.getBody(); // Select the first child node in the body Node curNode = body.getFirstChild(); while (curNode != null) { // Save the pointer to the next sibling node because if the current // node is removed from the parent in the next step, we will have // no way of finding the next node to continue the loop Node nextNode = curNode.getNextSibling(); // A section body can contain Paragraph and Table nodes // If the node is a Table, remove it from the parent if (curNode.getNodeType() == NodeType.TABLE) { curNode.remove(); } // Continue going through child nodes until null (no more siblings) is reached curNode = nextNode; }
toString | → inherited from Node |
public java.lang.String toString(SaveOptions saveOptions) throws java.lang.Exception |
saveOptions
- Specifies the options that control how the node is saved.Example:
Exports the content of a node to String in HTML format using custom specified options.Document doc = new Document(getMyDir() + "Document.docx"); // Extract the last paragraph in the document to convert to HTML Node node = doc.getLastSection().getBody().getLastParagraph(); // Create an instance of HtmlSaveOptions and set a few options HtmlSaveOptions saveOptions = new HtmlSaveOptions(); saveOptions.setExportHeadersFootersMode(ExportHeadersFootersMode.PER_SECTION); saveOptions.setExportRelativeFontSize(true); // Convert the document to HTML and return as a String. Pass the instance of HtmlSaveOptions to // to use the specified options during the conversion String nodeAsHtml = node.toString(saveOptions);
toString | → inherited from Node |
public java.lang.String toString(int saveFormat) throws java.lang.Exception |
saveFormat
- A SaveFormat value.Example:
Shows how to extract the label of each paragraph in a list as a value or a String.Document doc = new Document(getMyDir() + "Rendering.docx"); doc.updateListLabels(); int listParaCount = 1; for (Paragraph paragraph : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)) { // Find if we have the paragraph list. In our document our list uses plain arabic numbers, // which start at three and ends at six if (paragraph.getListFormat().isListItem()) { System.out.println(MessageFormat.format("Paragraph #{0}", listParaCount)); // This is the text we get when actually getting when we output this node to text format // The list labels are not included in this text output. Trim any paragraph formatting characters String paragraphText = paragraph.toString(SaveFormat.TEXT).trim(); System.out.println("Exported Text: " + paragraphText); ListLabel label = paragraph.getListLabel(); // This gets the position of the paragraph in current level of the list. If we have a list with multiple level then this // will tell us what position it is on that particular level System.out.println("Numerical Id: " + label.getLabelValue()); // Combine them together to include the list label with the text in the output System.out.println("List label combined with text: " + label.getLabelString() + " " + paragraphText); listParaCount++; } }
Example:
Exports the content of a node to String in HTML format using default options.Document doc = new Document(getMyDir() + "Document.docx"); // Extract the last paragraph in the document to convert to HTML Node node = doc.getLastSection().getBody().getLastParagraph(); // When ToString is called using the SaveFormat overload then conversion is executed using default save options // When saving to HTML using default options the following settings are set: // ExportImagesAsBase64 = true // CssStyleSheetType = CssStyleSheetType.Inline // ExportFontResources = false String nodeAsHtml = node.toString(SaveFormat.HTML);
Example:
Shows the difference between calling the GetText and ToString methods on a node.Document doc = new Document(); // Enter a field into the document DocumentBuilder builder = new DocumentBuilder(doc); builder.insertField("MERGEFIELD Field"); // GetText will retrieve all field codes and special characters Assert.assertEquals("\u0013MERGEFIELD Field\u0014«Field»\u0015\f", doc.getText()); // ToString will give us the plaintext version of the document in the save format we put into the parameter Assert.assertEquals("«Field»\r\n", doc.toString(SaveFormat.TEXT));