java.lang.ObjectNode
CompositeNode
com.aspose.words.Paragraph
public class Paragraph
To learn more, visit the Working with Paragraphs documentation article. The complete list of child nodes that can occur inside a paragraph consists of
A valid paragraph in Microsoft Word always ends with a paragraph break character and
a minimal valid paragraph consists just of a paragraph break. The Do not include the end of paragraph Example:
Document doc = new Document();
// A blank document contains one section, one body and one paragraph.
// Call the "RemoveAllChildren" method to remove all those nodes,
// and end up with a document node with no children.
doc.removeAllChildren();
// This document now has no composite child nodes that we can add content to.
// If we wish to edit it, we will need to repopulate its node collection.
// First, create a new section, and then append it as a child to the root document node.
Section section = new Section(doc);
doc.appendChild(section);
// Set some page setup properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain and display all its contents
// on the page between the section's header and footer.
Body body = new Body(doc);
section.appendChild(body);
// Create a paragraph, set some formatting properties, and then append it as a child to the body.
Paragraph para = new Paragraph(doc);
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
body.appendChild(para);
// Finally, add some content to do the document. Create a run,
// set its appearance and contents, and then append it as a child to the paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!", doc.getText().trim());
doc.save(getArtifactsDir() + "Section.CreateManually.docx");
| Constructor Summary |
|---|
Paragraph(DocumentBase doc)
Initializes a new instance of the |
| Property Getters/Setters Summary | ||
|---|---|---|
boolean | getBreakIsStyleSeparator() | |
| True if this paragraph break is a Style Separator. A style separator allows one paragraph to consist of parts that have different paragraph styles. | ||
int | getCount() | → inherited from CompositeNode |
| Gets the number of immediate children of this node. | ||
int | getCustomNodeId() | → inherited from Node |
void | setCustomNodeId(int value) | |
| Specifies custom node identifier. | ||
DocumentBase | getDocument() | → inherited from Node |
| Gets the document to which this node belongs. | ||
Node | getFirstChild() | → inherited from CompositeNode |
| Gets the first child of the node. | ||
FrameFormat | getFrameFormat() | |
| Provides access to the frame formatting properties. | ||
boolean | hasChildNodes() | → inherited from CompositeNode |
Returns true if this node has any child nodes.
|
||
boolean | isComposite() | → inherited from CompositeNode |
Returns true as this node can have child nodes.
|
||
boolean | isDeleteRevision() | |
| Returns true if this object was deleted in Microsoft Word while change tracking was enabled. | ||
boolean | isEndOfCell() | |
|
True if this paragraph is the last paragraph in a |
||
boolean | isEndOfDocument() | |
| True if this paragraph is the last paragraph in the last section of the document. | ||
boolean | isEndOfHeaderFooter() | |
|
True if this paragraph is the last paragraph in the |
||
boolean | isEndOfSection() | |
|
True if this paragraph is the last paragraph in the |
||
boolean | isFormatRevision() | |
| Returns true if formatting of the object was changed in Microsoft Word while change tracking was enabled. | ||
boolean | isInCell() | |
|
True if this paragraph is an immediate child of |
||
boolean | isInsertRevision() | |
| Returns true if this object was inserted in Microsoft Word while change tracking was enabled. | ||
boolean | isListItem() | |
| True when the paragraph is an item in a bulleted or numbered list in original revision. | ||
boolean | isMoveFromRevision() | |
Returns true if this object was moved (deleted) in Microsoft Word while change tracking was enabled.
|
||
boolean | isMoveToRevision() | |
Returns true if this object was moved (inserted) in Microsoft Word while change tracking was enabled.
|
||
Node | getLastChild() | → inherited from CompositeNode |
| Gets the last child of the node. | ||
ListFormat | getListFormat() | |
| Provides access to the list formatting properties of the paragraph. | ||
ListLabel | getListLabel() | |
|
Gets a |
||
Node | getNextSibling() | → inherited from Node |
| Gets the node immediately following this node. | ||
int | getNodeType() | |
|
Returns |
||
Font | getParagraphBreakFont() | |
| Provides access to the font formatting of the paragraph break character. | ||
ParagraphFormat | getParagraphFormat() | |
| Provides access to the paragraph formatting properties. | ||
CompositeNode | getParentNode() | → inherited from Node |
| Gets the immediate parent of this node. | ||
Section | getParentSection() | |
|
Retrieves the parent |
||
Story | getParentStory() | |
|
Retrieves the parent section-level story that can be |
||
Node | getPreviousSibling() | → inherited from Node |
| Gets the node immediately preceding this node. | ||
Range | getRange() | → inherited from Node |
|
Returns a |
||
RunCollection | getRuns() | |
| Provides access to the typed collection of pieces of text inside the paragraph. | ||
| Method Summary | ||
|---|---|---|
boolean | accept(DocumentVisitor visitor) | |
| Accepts a visitor. | ||
int | acceptEnd(DocumentVisitor visitor) | |
| Accepts a visitor for visiting the end of the document's paragraph. | ||
int | acceptStart(DocumentVisitor visitor) | |
| Accepts a visitor for visiting the start of the document's paragraph. | ||
Field | appendField(int fieldType, boolean updateField) | |
| Appends a field to this paragraph. | ||
Field | appendField(java.lang.String fieldCode) | |
| Appends a field to this paragraph. | ||
Field | appendField(java.lang.String fieldCode, java.lang.String fieldValue) | |
| Appends a field to this paragraph. | ||
Node | deepClone(boolean isCloneChildren) | → inherited from Node |
| Creates a duplicate of the 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. | ||
Node | getChild(int nodeType, int index, boolean isDeep) | → inherited from CompositeNode |
| Returns an Nth child node that matches the specified type. | ||
NodeCollection | getChildNodes(int nodeType, boolean isDeep) | → inherited from CompositeNode |
| Returns a live collection of child nodes that match the specified type. | ||
TabStop[] | getEffectiveTabStops() | |
| Returns array of all tab stops applied to this paragraph, including applied indirectly by styles or lists. | ||
java.lang.String | getText() | |
| Gets the text of this paragraph including the end of paragraph character. | ||
int | indexOf(Node child) | → inherited from CompositeNode |
| Returns the index of the specified child node in the child node array. | ||
Field | insertField(int fieldType, boolean updateField, Node refNode, boolean isAfter) | |
| Inserts a field into this paragraph. | ||
Field | insertField(java.lang.String fieldCode, Node refNode, boolean isAfter) | |
| Inserts a field into this paragraph. | ||
Field | insertField(java.lang.String fieldCode, java.lang.String fieldValue, Node refNode, boolean isAfter) | |
| Inserts a field into this paragraph. | ||
java.util.Iterator<Node> | iterator() | → inherited from CompositeNode |
| Provides support for the for each style iteration over the child nodes of this node. | ||
int | joinRunsWithSameFormatting() | |
| Joins runs with the same formatting in the paragraph. | ||
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. | ||
void | removeAllChildren() | → inherited from CompositeNode |
| Removes all the child nodes of the current node. | ||
void | removeSmartTags() | → inherited from CompositeNode |
|
Removes all |
||
NodeList | selectNodes(java.lang.String xpath) | → inherited from CompositeNode |
| Selects a list of nodes matching the XPath expression. | ||
Node | selectSingleNode(java.lang.String xpath) | → inherited from CompositeNode |
|
Selects the first |
||
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. | ||
| Constructor Detail |
|---|
public Paragraph(DocumentBase doc)
When null.
To append
doc - The owner document.Example:
Shows how to construct an Aspose.Words document by hand.
Document doc = new Document();
// A blank document contains one section, one body and one paragraph.
// Call the "RemoveAllChildren" method to remove all those nodes,
// and end up with a document node with no children.
doc.removeAllChildren();
// This document now has no composite child nodes that we can add content to.
// If we wish to edit it, we will need to repopulate its node collection.
// First, create a new section, and then append it as a child to the root document node.
Section section = new Section(doc);
doc.appendChild(section);
// Set some page setup properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain and display all its contents
// on the page between the section's header and footer.
Body body = new Body(doc);
section.appendChild(body);
// Create a paragraph, set some formatting properties, and then append it as a child to the body.
Paragraph para = new Paragraph(doc);
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
body.appendChild(para);
// Finally, add some content to do the document. Create a run,
// set its appearance and contents, and then append it as a child to the paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!", doc.getText().trim());
doc.save(getArtifactsDir() + "Section.CreateManually.docx");| Property Getters/Setters Detail |
|---|
getBreakIsStyleSeparator | |
public boolean getBreakIsStyleSeparator() | |
Example:
Shows how to write text to the same line as a TOC heading and have it not show up in the TOC.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertTableOfContents("\\o \\h \\z \\u");
builder.insertBreak(BreakType.PAGE_BREAK);
// Insert a paragraph with a style that the TOC will pick up as an entry.
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
// Both these strings are in the same paragraph and will therefore show up on the same TOC entry.
builder.write("Heading 1. ");
builder.write("Will appear in the TOC. ");
// If we insert a style separator, we can write more text in the same paragraph
// and use a different style without showing up in the TOC.
// If we use a heading type style after the separator, we can draw multiple TOC entries from one document text line.
builder.insertStyleSeparator();
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.QUOTE);
builder.write("Won't appear in the TOC. ");
Assert.assertTrue(doc.getFirstSection().getBody().getParagraphs().get(0).getBreakIsStyleSeparator());
doc.updateFields();
doc.save(getArtifactsDir() + "Paragraph.BreakIsStyleSeparator.docx");getCount | → inherited from CompositeNode |
public int getCount() | |
Example:
Shows how to add, update and delete child nodes in a CompositeNode's collection of children.
Document doc = new Document();
// An empty document, by default, has one paragraph.
Assert.assertEquals(1, doc.getFirstSection().getBody().getParagraphs().getCount());
// Composite nodes such as our paragraph can contain other composite and inline nodes as children.
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
Run paragraphText = new Run(doc, "Initial text. ");
paragraph.appendChild(paragraphText);
// Create three more run nodes.
Run run1 = new Run(doc, "Run 1. ");
Run run2 = new Run(doc, "Run 2. ");
Run run3 = new Run(doc, "Run 3. ");
// The document body will not display these runs until we insert them into a composite node
// that itself is a part of the document's node tree, as we did with the first run.
// We can determine where the text contents of nodes that we insert
// appears in the document by specifying an insertion location relative to another node in the paragraph.
Assert.assertEquals("Initial text.", paragraph.getText().trim());
// Insert the second run into the paragraph in front of the initial run.
paragraph.insertBefore(run2, paragraphText);
Assert.assertEquals("Run 2. Initial text.", paragraph.getText().trim());
// Insert the third run after the initial run.
paragraph.insertAfter(run3, paragraphText);
Assert.assertEquals("Run 2. Initial text. Run 3.", paragraph.getText().trim());
// Insert the first run to the start of the paragraph's child nodes collection.
paragraph.prependChild(run1);
Assert.assertEquals("Run 1. Run 2. Initial text. Run 3.", paragraph.getText().trim());
Assert.assertEquals(4, paragraph.getChildNodes(NodeType.ANY, true).getCount());
// We can modify the contents of the run by editing and deleting existing child nodes.
((Run) paragraph.getChildNodes(NodeType.RUN, true).get(1)).setText("Updated run 2. ");
paragraph.getChildNodes(NodeType.RUN, true).remove(paragraphText);
Assert.assertEquals("Run 1. Updated run 2. Run 3.", paragraph.getText().trim());
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, true).getCount());getCustomNodeId/setCustomNodeId | → inherited from Node |
public int getCustomNodeId() / public void setCustomNodeId(int value) | |
Default is zero.
This identifier can be set and used arbitrarily. For example, as a key to get external data.
Important note, specified value is not saved to an output file and exists only during the node lifetime.
Example:
Shows how to traverse through a composite node's collection of child nodes.
Document doc = new Document();
// Add two runs and one shape as child nodes to the first paragraph of this document.
Paragraph paragraph = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 0, true);
paragraph.appendChild(new Run(doc, "Hello world! "));
Shape shape = new Shape(doc, ShapeType.RECTANGLE);
shape.setWidth(200.0);
shape.setHeight(200.0);
// Note that the 'CustomNodeId' is not saved to an output file and exists only during the node lifetime.
shape.setCustomNodeId(100);
shape.setWrapType(WrapType.INLINE);
paragraph.appendChild(shape);
paragraph.appendChild(new Run(doc, "Hello again!"));
// Iterate through the paragraph's collection of immediate children,
// and print any runs or shapes that we find within.
NodeCollection children = paragraph.getChildNodes(NodeType.ANY, false);
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, false).getCount());
for (Node child : (Iterable<Node>) children)
switch (child.getNodeType()) {
case NodeType.RUN:
System.out.println("Run contents:");
System.out.println(MessageFormat.format("\t\"{0}\"", child.getText().trim()));
break;
case NodeType.SHAPE:
Shape childShape = (Shape)child;
System.out.println("Shape:");
System.out.println(MessageFormat.format("\t{0}, {1}x{2}", childShape.getShapeType(), childShape.getWidth(), childShape.getHeight()));
break;
}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 how to create a node and set its owning document.
Document doc = new Document();
Paragraph para = new Paragraph(doc);
para.appendChild(new Run(doc, "Hello world!"));
// We have not yet appended this paragraph as a child to any composite node.
Assert.assertNull(para.getParentNode());
// If a node is an appropriate child node type of another composite node,
// we can attach it as a child only if both nodes have the same owner document.
// The owner document is the document we passed to the node's constructor.
// We have not attached this paragraph to the document, so the document does not contain its text.
Assert.assertEquals(para.getDocument(), doc);
Assert.assertEquals("", doc.getText().trim());
// Since the document owns this paragraph, we can apply one of its styles to the paragraph's contents.
para.getParagraphFormat().setStyleName("Heading 1");
// Add this node to the document, and then verify its contents.
doc.getFirstSection().getBody().appendChild(para);
Assert.assertEquals(doc.getFirstSection().getBody(), para.getParentNode());
Assert.assertEquals("Hello world!", doc.getText().trim());getFirstChild | → inherited from CompositeNode |
public Node getFirstChild() | |
null is returned.
Example:
Shows how to use a node's NextSibling property to enumerate through its immediate children.
Document doc = new Document(getMyDir() + "Paragraphs.docx");
for (Node node = doc.getFirstSection().getBody().getFirstChild(); node != null; node = node.getNextSibling()) {
System.out.println(Node.nodeTypeToString(node.getNodeType()));
}Example:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}getFrameFormat | |
public FrameFormat getFrameFormat() | |
Example:
Shows how to get information about formatting properties of paragraphs that are frames.Document doc = new Document(getMyDir() + "Paragraph frame.docx"); Paragraph paragraphFrame = IterableUtils.find(doc.getFirstSection().getBody().getParagraphs(), p -> p.getFrameFormat().isFrame()); Assert.assertEquals(233.3d, paragraphFrame.getFrameFormat().getWidth()); Assert.assertEquals(138.8d, paragraphFrame.getFrameFormat().getHeight()); Assert.assertEquals(HeightRule.AT_LEAST, paragraphFrame.getFrameFormat().getHeightRule()); Assert.assertEquals(HorizontalAlignment.DEFAULT, paragraphFrame.getFrameFormat().getHorizontalAlignment()); Assert.assertEquals(VerticalAlignment.DEFAULT, paragraphFrame.getFrameFormat().getVerticalAlignment()); Assert.assertEquals(34.05d, paragraphFrame.getFrameFormat().getHorizontalPosition()); Assert.assertEquals(RelativeHorizontalPosition.PAGE, paragraphFrame.getFrameFormat().getRelativeHorizontalPosition()); Assert.assertEquals(9.0d, paragraphFrame.getFrameFormat().getHorizontalDistanceFromText()); Assert.assertEquals(20.5d, paragraphFrame.getFrameFormat().getVerticalPosition()); Assert.assertEquals(RelativeVerticalPosition.PARAGRAPH, paragraphFrame.getFrameFormat().getRelativeVerticalPosition()); Assert.assertEquals(0.0d, paragraphFrame.getFrameFormat().getVerticalDistanceFromText());
hasChildNodes | → inherited from CompositeNode |
public boolean hasChildNodes() | |
true if this node has any child nodes.
Example:
Shows how to combine the rows from two tables into one.
Document doc = new Document(getMyDir() + "Tables.docx");
// Below are two ways of getting a table from a document.
// 1 - From the "Tables" collection of a Body node:
Table firstTable = doc.getFirstSection().getBody().getTables().get(0);
// 2 - Using the "GetChild" method:
Table secondTable = (Table) doc.getChild(NodeType.TABLE, 1, true);
// Append all rows from the current table to the next.
while (secondTable.hasChildNodes())
firstTable.getRows().add(secondTable.getFirstRow());
// Remove the empty table container.
secondTable.remove();
doc.save(getArtifactsDir() + "Table.CombineTables.docx");isComposite | → inherited from CompositeNode |
public boolean isComposite() | |
true as this node can have child nodes.
Example:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}isDeleteRevision | |
public boolean isDeleteRevision() | |
Example:
Shows how to work with revision paragraphs.
Document doc = new Document();
Body body = doc.getFirstSection().getBody();
Paragraph para = body.getFirstParagraph();
para.appendChild(new Run(doc, "Paragraph 1. "));
body.appendParagraph("Paragraph 2. ");
body.appendParagraph("Paragraph 3. ");
// The above paragraphs are not revisions.
// Paragraphs that we add after starting revision tracking will register as "Insert" revisions.
doc.startTrackRevisions("John Doe", new Date());
para = body.appendParagraph("Paragraph 4. ");
Assert.assertTrue(para.isInsertRevision());
// Paragraphs that we remove after starting revision tracking will register as "Delete" revisions.
ParagraphCollection paragraphs = body.getParagraphs();
Assert.assertEquals(4, paragraphs.getCount());
para = paragraphs.get(2);
para.remove();
// Such paragraphs will remain until we either accept or reject the delete revision.
// Accepting the revision will remove the paragraph for good,
// and rejecting the revision will leave it in the document as if we never deleted it.
Assert.assertEquals(4, paragraphs.getCount());
Assert.assertTrue(para.isDeleteRevision());
// Accept the revision, and then verify that the paragraph is gone.
doc.acceptAllRevisions();
Assert.assertEquals(paragraphs.getCount(), 3);
Assert.assertEquals(para.getCount(), 0);
Assert.assertEquals(
"Paragraph 1. \r" +
"Paragraph 2. \r" +
"Paragraph 4.", doc.getText().trim());isEndOfCell | |
public boolean isEndOfCell() | |
Example:
Shows how to set a table to stay together on the same page.
Document doc = new Document(getMyDir() + "Table spanning two pages.docx");
Table table = doc.getFirstSection().getBody().getTables().get(0);
// Enabling KeepWithNext for every paragraph in the table except for the
// last ones in the last row will prevent the table from splitting across multiple pages.
for (Cell cell : (Iterable<Cell>) table.getChildNodes(NodeType.CELL, true))
for (Paragraph para : cell.getParagraphs()) {
Assert.assertTrue(para.isInCell());
if (!(cell.getParentRow().isLastRow() && para.isEndOfCell()))
para.getParagraphFormat().setKeepWithNext(true);
}
doc.save(getArtifactsDir() + "Table.KeepTableTogether.docx");isEndOfDocument | |
public boolean isEndOfDocument() | |
Example:
Shows how to insert a paragraph into the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Font font = builder.getFont();
font.setSize(16.0);
font.setBold(true);
font.setColor(Color.BLUE);
font.setName("Arial");
font.setUnderline(Underline.DASH);
ParagraphFormat paragraphFormat = builder.getParagraphFormat();
paragraphFormat.setFirstLineIndent(8.0);
paragraphFormat.setAlignment(ParagraphAlignment.JUSTIFY);
paragraphFormat.setAddSpaceBetweenFarEastAndAlpha(true);
paragraphFormat.setAddSpaceBetweenFarEastAndDigit(true);
paragraphFormat.setKeepTogether(true);
// The "Writeln" method ends the paragraph after appending text
// and then starts a new line, adding a new paragraph.
builder.writeln("Hello world!");
Assert.assertTrue(builder.getCurrentParagraph().isEndOfDocument());isEndOfHeaderFooter | |
public boolean isEndOfHeaderFooter() | |
Example:
Shows how to create a header and a footer.
Document doc = new Document();
// Create a header and append a paragraph to it. The text in that paragraph
// will appear at the top of every page of this section, above the main body text.
HeaderFooter header = new HeaderFooter(doc, HeaderFooterType.HEADER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(header);
Paragraph para = header.appendParagraph("My header.");
Assert.assertTrue(header.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
// Create a footer and append a paragraph to it. The text in that paragraph
// will appear at the bottom of every page of this section, below the main body text.
HeaderFooter footer = new HeaderFooter(doc, HeaderFooterType.FOOTER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(footer);
para = footer.appendParagraph("My footer.");
Assert.assertFalse(footer.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
Assert.assertEquals(para.getParentStory(), footer);
Assert.assertEquals(para.getParentSection(), footer.getParentSection());
Assert.assertEquals(header.getParentSection(), footer.getParentSection());
doc.save(getArtifactsDir() + "HeaderFooter.Create.docx");isEndOfSection | |
public boolean isEndOfSection() | |
Example:
Shows how to insert the contents of one document to a bookmark in another document.
public void insertAtBookmark() throws Exception {
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.startBookmark("InsertionPoint");
builder.write("We will insert a document here: ");
builder.endBookmark("InsertionPoint");
Document docToInsert = new Document();
builder = new DocumentBuilder(docToInsert);
builder.write("Hello world!");
docToInsert.save(getArtifactsDir() + "NodeImporter.InsertAtMergeField.docx");
Bookmark bookmark = doc.getRange().getBookmarks().get("InsertionPoint");
insertDocument(bookmark.getBookmarkStart().getParentNode(), docToInsert);
Assert.assertEquals("We will insert a document here: " +
"\rHello world!", doc.getText().trim());
}
/// <summary>
/// Inserts the contents of a document after the specified node.
/// </summary>
static void insertDocument(Node insertionDestination, Document docToInsert) {
if (((insertionDestination.getNodeType()) == (NodeType.PARAGRAPH)) || ((insertionDestination.getNodeType()) == (NodeType.TABLE))) {
CompositeNode destinationParent = insertionDestination.getParentNode();
NodeImporter importer =
new NodeImporter(docToInsert, insertionDestination.getDocument(), ImportFormatMode.KEEP_SOURCE_FORMATTING);
// Loop through all block-level nodes in the section's body,
// then clone and insert every node that is not the last empty paragraph of a section.
for (Section srcSection : docToInsert.getSections())
for (Node srcNode : srcSection.getBody()) {
if (((srcNode.getNodeType()) == (NodeType.PARAGRAPH))) {
Paragraph para = (Paragraph) srcNode;
if (para.isEndOfSection() && !para.hasChildNodes())
continue;
}
Node newNode = importer.importNode(srcNode, true);
destinationParent.insertAfter(newNode, insertionDestination);
insertionDestination = newNode;
}
} else {
throw new IllegalArgumentException("The destination node should be either a paragraph or table.");
}
}isFormatRevision | |
public boolean isFormatRevision() | |
Example:
Shows how to check whether a paragraph is a format revision.Document doc = new Document(getMyDir() + "Format revision.docx"); // This paragraph is a "Format" revision, which occurs when we change the formatting of existing text // while tracking revisions in Microsoft Word via "Review" -> "Track changes". Assert.assertTrue(doc.getFirstSection().getBody().getFirstParagraph().isFormatRevision());
isInCell | |
public boolean isInCell() | |
Example:
Shows how to set a table to stay together on the same page.
Document doc = new Document(getMyDir() + "Table spanning two pages.docx");
Table table = doc.getFirstSection().getBody().getTables().get(0);
// Enabling KeepWithNext for every paragraph in the table except for the
// last ones in the last row will prevent the table from splitting across multiple pages.
for (Cell cell : (Iterable<Cell>) table.getChildNodes(NodeType.CELL, true))
for (Paragraph para : cell.getParagraphs()) {
Assert.assertTrue(para.isInCell());
if (!(cell.getParentRow().isLastRow() && para.isEndOfCell()))
para.getParagraphFormat().setKeepWithNext(true);
}
doc.save(getArtifactsDir() + "Table.KeepTableTogether.docx");isInsertRevision | |
public boolean isInsertRevision() | |
Example:
Shows how to work with revision paragraphs.
Document doc = new Document();
Body body = doc.getFirstSection().getBody();
Paragraph para = body.getFirstParagraph();
para.appendChild(new Run(doc, "Paragraph 1. "));
body.appendParagraph("Paragraph 2. ");
body.appendParagraph("Paragraph 3. ");
// The above paragraphs are not revisions.
// Paragraphs that we add after starting revision tracking will register as "Insert" revisions.
doc.startTrackRevisions("John Doe", new Date());
para = body.appendParagraph("Paragraph 4. ");
Assert.assertTrue(para.isInsertRevision());
// Paragraphs that we remove after starting revision tracking will register as "Delete" revisions.
ParagraphCollection paragraphs = body.getParagraphs();
Assert.assertEquals(4, paragraphs.getCount());
para = paragraphs.get(2);
para.remove();
// Such paragraphs will remain until we either accept or reject the delete revision.
// Accepting the revision will remove the paragraph for good,
// and rejecting the revision will leave it in the document as if we never deleted it.
Assert.assertEquals(4, paragraphs.getCount());
Assert.assertTrue(para.isDeleteRevision());
// Accept the revision, and then verify that the paragraph is gone.
doc.acceptAllRevisions();
Assert.assertEquals(paragraphs.getCount(), 3);
Assert.assertEquals(para.getCount(), 0);
Assert.assertEquals(
"Paragraph 1. \r" +
"Paragraph 2. \r" +
"Paragraph 4.", doc.getText().trim());isListItem | |
public boolean isListItem() | |
Example:
Shows how to nest a list inside another list.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// A list allows us to organize and decorate sets of paragraphs with prefix symbols and indents.
// We can create nested lists by increasing the indent level.
// We can begin and end a list by using a document builder's "ListFormat" property.
// Each paragraph that we add between a list's start and the end will become an item in the list.
// Create an outline list for the headings.
List outlineList = doc.getLists().add(ListTemplate.OUTLINE_NUMBERS);
builder.getListFormat().setList(outlineList);
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.writeln("This is my Chapter 1");
// Create a numbered list.
List numberedList = doc.getLists().add(ListTemplate.NUMBER_DEFAULT);
builder.getListFormat().setList(numberedList);
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.NORMAL);
builder.writeln("Numbered list item 1.");
// Every paragraph that comprises a list will have this flag.
Assert.assertTrue(builder.getCurrentParagraph().isListItem());
Assert.assertTrue(builder.getParagraphFormat().isListItem());
// Create a bulleted list.
List bulletedList = doc.getLists().add(ListTemplate.BULLET_DEFAULT);
builder.getListFormat().setList(bulletedList);
builder.getParagraphFormat().setLeftIndent(72.0);
builder.writeln("Bulleted list item 1.");
builder.writeln("Bulleted list item 2.");
builder.getParagraphFormat().clearFormatting();
// Revert to the numbered list.
builder.getListFormat().setList(numberedList);
builder.writeln("Numbered list item 2.");
builder.writeln("Numbered list item 3.");
// Revert to the outline list.
builder.getListFormat().setList(outlineList);
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.writeln("This is my Chapter 2");
builder.getParagraphFormat().clearFormatting();
builder.getDocument().save(getArtifactsDir() + "Lists.NestedLists.docx");isMoveFromRevision | |
public boolean isMoveFromRevision() | |
true if this object was moved (deleted) in Microsoft Word while change tracking was enabled.
Example:
Shows how to check whether a paragraph is a move revision.Document doc = new Document(getMyDir() + "Revisions.docx"); // This document contains "Move" revisions, which appear when we highlight text with the cursor, // and then drag it to move it to another location // while tracking revisions in Microsoft Word via "Review" -> "Track changes". Assert.assertEquals(6, IterableUtils.countMatches(doc.getRevisions(), r -> r.getRevisionType() == RevisionType.MOVING)); ParagraphCollection paragraphs = doc.getFirstSection().getBody().getParagraphs(); // Move revisions consist of pairs of "Move from", and "Move to" revisions. // These revisions are potential changes to the document that we can either accept or reject. // Before we accept/reject a move revision, the document // must keep track of both the departure and arrival destinations of the text. // The second and the fourth paragraph define one such revision, and thus both have the same contents. Assert.assertEquals(paragraphs.get(1).getText(), paragraphs.get(3).getText()); // The "Move from" revision is the paragraph where we dragged the text from. // If we accept the revision, this paragraph will disappear, // and the other will remain and no longer be a revision. Assert.assertTrue(paragraphs.get(1).isMoveFromRevision()); // The "Move to" revision is the paragraph where we dragged the text to. // If we reject the revision, this paragraph instead will disappear, and the other will remain. Assert.assertTrue(paragraphs.get(3).isMoveToRevision());
isMoveToRevision | |
public boolean isMoveToRevision() | |
true if this object was moved (inserted) in Microsoft Word while change tracking was enabled.
Example:
Shows how to check whether a paragraph is a move revision.Document doc = new Document(getMyDir() + "Revisions.docx"); // This document contains "Move" revisions, which appear when we highlight text with the cursor, // and then drag it to move it to another location // while tracking revisions in Microsoft Word via "Review" -> "Track changes". Assert.assertEquals(6, IterableUtils.countMatches(doc.getRevisions(), r -> r.getRevisionType() == RevisionType.MOVING)); ParagraphCollection paragraphs = doc.getFirstSection().getBody().getParagraphs(); // Move revisions consist of pairs of "Move from", and "Move to" revisions. // These revisions are potential changes to the document that we can either accept or reject. // Before we accept/reject a move revision, the document // must keep track of both the departure and arrival destinations of the text. // The second and the fourth paragraph define one such revision, and thus both have the same contents. Assert.assertEquals(paragraphs.get(1).getText(), paragraphs.get(3).getText()); // The "Move from" revision is the paragraph where we dragged the text from. // If we accept the revision, this paragraph will disappear, // and the other will remain and no longer be a revision. Assert.assertTrue(paragraphs.get(1).isMoveFromRevision()); // The "Move to" revision is the paragraph where we dragged the text to. // If we reject the revision, this paragraph instead will disappear, and the other will remain. Assert.assertTrue(paragraphs.get(3).isMoveToRevision());
getLastChild | → inherited from CompositeNode |
public Node getLastChild() | |
null is returned.
Example:
Shows how to use of methods of Node and CompositeNode to remove a section before the last section in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("Section 1 text.");
builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);
builder.writeln("Section 2 text.");
// Both sections are siblings of each other.
Section lastSection = (Section) doc.getLastChild();
Section firstSection = (Section) lastSection.getPreviousSibling();
// Remove a section based on its sibling relationship with another section.
if (lastSection.getPreviousSibling() != null)
doc.removeChild(firstSection);
// The section we removed was the first one, leaving the document with only the second.
Assert.assertEquals("Section 2 text.", doc.getText().trim());getListFormat | |
public ListFormat getListFormat() | |
Example:
Shows how to output all paragraphs in a document that are list items.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.getListFormat().applyNumberDefault();
builder.writeln("Numbered list item 1");
builder.writeln("Numbered list item 2");
builder.writeln("Numbered list item 3");
builder.getListFormat().removeNumbers();
builder.getListFormat().applyBulletDefault();
builder.writeln("Bulleted list item 1");
builder.writeln("Bulleted list item 2");
builder.writeln("Bulleted list item 3");
builder.getListFormat().removeNumbers();
NodeCollection paras = doc.getChildNodes(NodeType.PARAGRAPH, true);
for (Paragraph para : (Iterable<Paragraph>) paras) {
if (para.getListFormat().isListItem()) {
System.out.println(java.text.MessageFormat.format("*** A paragraph belongs to list {0}", para.getListFormat().getList().getListId()));
System.out.println(para.getText());
}
}getListLabel | |
public ListLabel getListLabel() | |
Example:
Shows how to extract the list labels of all paragraphs that are list items.
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("List item paragraph #{0}", listParaCount));
// This is the text we get when getting when we output this node to text format.
// This text output will omit list labels. 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 the current level of the list. If we have a list with multiple levels,
// this will tell us what position it is on that level.
System.out.println("\tNumerical Id: {label.LabelValue}");
// Combine them together to include the list label with the text in the output.
System.out.println("\tList label combined with text: {label.LabelString} {paragraphText}");
}
}getNextSibling | → inherited from Node |
public Node getNextSibling() | |
null is returned.
Example:
Shows how to use a node's NextSibling property to enumerate through its immediate children.
Document doc = new Document(getMyDir() + "Paragraphs.docx");
for (Node node = doc.getFirstSection().getBody().getFirstChild(); node != null; node = node.getNextSibling()) {
System.out.println(Node.nodeTypeToString(node.getNodeType()));
}Example:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}getNodeType | |
public int getNodeType() | |
Example:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}getParagraphBreakFont | |
public Font getParagraphBreakFont() | |
Example:
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
public void removeHiddenContentFromDocument() throws Exception {
Document doc = new Document(getMyDir() + "Hidden content.docx");
RemoveHiddenContentVisitor hiddenContentRemover = new RemoveHiddenContentVisitor();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 4, true);
para.accept(hiddenContentRemover);
// 2 - Table node:
Table table = doc.getFirstSection().getBody().getTables().get(0);
table.accept(hiddenContentRemover);
// 3 - Document node:
doc.accept(hiddenContentRemover);
doc.save(getArtifactsDir() + "Font.RemoveHiddenContentFromDocument.docx");
}
/// <summary>
/// Removes all visited nodes marked as "hidden content".
/// </summary>
public static class RemoveHiddenContentVisitor extends DocumentVisitor {
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
if (fieldStart.getFont().getHidden())
fieldStart.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
if (fieldEnd.getFont().getHidden())
fieldEnd.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
if (fieldSeparator.getFont().getHidden())
fieldSeparator.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
if (run.getFont().getHidden())
run.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph node is encountered in the document.
/// </summary>
public int visitParagraphStart(Paragraph paragraph) {
if (paragraph.getParagraphBreakFont().getHidden())
paragraph.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField is encountered in the document.
/// </summary>
public int visitFormField(FormField formField) {
if (formField.getFont().getHidden())
formField.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a GroupShape is encountered in the document.
/// </summary>
public int visitGroupShapeStart(GroupShape groupShape) {
if (groupShape.getFont().getHidden())
groupShape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Shape is encountered in the document.
/// </summary>
public int visitShapeStart(Shape shape) {
if (shape.getFont().getHidden())
shape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Comment is encountered in the document.
/// </summary>
public int visitCommentStart(Comment comment) {
if (comment.getFont().getHidden())
comment.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote is encountered in the document.
/// </summary>
public int visitFootnoteStart(Footnote footnote) {
if (footnote.getFont().getHidden())
footnote.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialCharacter is encountered in the document.
/// </summary>
public int visitSpecialChar(SpecialChar specialChar) {
if (specialChar.getFont().getHidden())
specialChar.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Table node is ended in the document.
/// </summary>
public int visitTableEnd(Table table) {
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table.hasChildNodes())
table.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Cell node is ended in the document.
/// </summary>
public int visitCellEnd(Cell cell) {
if (!cell.hasChildNodes() && cell.getParentNode() != null)
cell.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Row node is ended in the document.
/// </summary>
public int visitRowEnd(Row row) {
if (!row.hasChildNodes() && row.getParentNode() != null)
row.remove();
return VisitorAction.CONTINUE;
}
}getParagraphFormat | |
public ParagraphFormat getParagraphFormat() | |
Example:
Shows how to construct an Aspose.Words document by hand.
Document doc = new Document();
// A blank document contains one section, one body and one paragraph.
// Call the "RemoveAllChildren" method to remove all those nodes,
// and end up with a document node with no children.
doc.removeAllChildren();
// This document now has no composite child nodes that we can add content to.
// If we wish to edit it, we will need to repopulate its node collection.
// First, create a new section, and then append it as a child to the root document node.
Section section = new Section(doc);
doc.appendChild(section);
// Set some page setup properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain and display all its contents
// on the page between the section's header and footer.
Body body = new Body(doc);
section.appendChild(body);
// Create a paragraph, set some formatting properties, and then append it as a child to the body.
Paragraph para = new Paragraph(doc);
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
body.appendChild(para);
// Finally, add some content to do the document. Create a run,
// set its appearance and contents, and then append it as a child to the paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!", doc.getText().trim());
doc.save(getArtifactsDir() + "Section.CreateManually.docx");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 a node's parent node.Document doc = new Document(); Paragraph para = doc.getFirstSection().getBody().getFirstParagraph(); // Append a child Run node to the document's first paragraph. Run run = new Run(doc, "Hello world!"); para.appendChild(run); // The paragraph is the parent node of the run node. We can trace this lineage // all the way to the document node, which is the root of the document's node tree. Assert.assertEquals(para, run.getParentNode()); Assert.assertEquals(doc.getFirstSection().getBody(), para.getParentNode()); Assert.assertEquals(doc.getFirstSection(), doc.getFirstSection().getBody().getParentNode()); Assert.assertEquals(doc, doc.getFirstSection().getParentNode());
Example:
Shows how to create a node and set its owning document.
Document doc = new Document();
Paragraph para = new Paragraph(doc);
para.appendChild(new Run(doc, "Hello world!"));
// We have not yet appended this paragraph as a child to any composite node.
Assert.assertNull(para.getParentNode());
// If a node is an appropriate child node type of another composite node,
// we can attach it as a child only if both nodes have the same owner document.
// The owner document is the document we passed to the node's constructor.
// We have not attached this paragraph to the document, so the document does not contain its text.
Assert.assertEquals(para.getDocument(), doc);
Assert.assertEquals("", doc.getText().trim());
// Since the document owns this paragraph, we can apply one of its styles to the paragraph's contents.
para.getParagraphFormat().setStyleName("Heading 1");
// Add this node to the document, and then verify its contents.
doc.getFirstSection().getBody().appendChild(para);
Assert.assertEquals(doc.getFirstSection().getBody(), para.getParentNode());
Assert.assertEquals("Hello world!", doc.getText().trim());getParentSection | |
public Section getParentSection() | |
Example:
Shows how to create a header and a footer.
Document doc = new Document();
// Create a header and append a paragraph to it. The text in that paragraph
// will appear at the top of every page of this section, above the main body text.
HeaderFooter header = new HeaderFooter(doc, HeaderFooterType.HEADER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(header);
Paragraph para = header.appendParagraph("My header.");
Assert.assertTrue(header.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
// Create a footer and append a paragraph to it. The text in that paragraph
// will appear at the bottom of every page of this section, below the main body text.
HeaderFooter footer = new HeaderFooter(doc, HeaderFooterType.FOOTER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(footer);
para = footer.appendParagraph("My footer.");
Assert.assertFalse(footer.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
Assert.assertEquals(para.getParentStory(), footer);
Assert.assertEquals(para.getParentSection(), footer.getParentSection());
Assert.assertEquals(header.getParentSection(), footer.getParentSection());
doc.save(getArtifactsDir() + "HeaderFooter.Create.docx");getParentStory | |
public Story getParentStory() | |
Example:
Shows how to create a header and a footer.
Document doc = new Document();
// Create a header and append a paragraph to it. The text in that paragraph
// will appear at the top of every page of this section, above the main body text.
HeaderFooter header = new HeaderFooter(doc, HeaderFooterType.HEADER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(header);
Paragraph para = header.appendParagraph("My header.");
Assert.assertTrue(header.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
// Create a footer and append a paragraph to it. The text in that paragraph
// will appear at the bottom of every page of this section, below the main body text.
HeaderFooter footer = new HeaderFooter(doc, HeaderFooterType.FOOTER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(footer);
para = footer.appendParagraph("My footer.");
Assert.assertFalse(footer.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
Assert.assertEquals(para.getParentStory(), footer);
Assert.assertEquals(para.getParentSection(), footer.getParentSection());
Assert.assertEquals(header.getParentSection(), footer.getParentSection());
doc.save(getArtifactsDir() + "HeaderFooter.Create.docx");getPreviousSibling | → inherited from Node |
public Node getPreviousSibling() | |
null is returned.
Example:
Shows how to use of methods of Node and CompositeNode to remove a section before the last section in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("Section 1 text.");
builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);
builder.writeln("Section 2 text.");
// Both sections are siblings of each other.
Section lastSection = (Section) doc.getLastChild();
Section firstSection = (Section) lastSection.getPreviousSibling();
// Remove a section based on its sibling relationship with another section.
if (lastSection.getPreviousSibling() != null)
doc.removeChild(firstSection);
// The section we removed was the first one, leaving the document with only the second.
Assert.assertEquals("Section 2 text.", doc.getText().trim());getRange | → inherited from Node |
public Range getRange() | |
Example:
Shows how to delete all the nodes from a range.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Add text to the first section in the document, and then add another section.
builder.write("Section 1. ");
builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);
builder.write("Section 2.");
Assert.assertEquals("Section 1. \fSection 2.", doc.getText().trim());
// Remove the first section entirely by removing all the nodes
// within its range, including the section itself.
doc.getSections().get(0).getRange().delete();
Assert.assertEquals(1, doc.getSections().getCount());
Assert.assertEquals("Section 2.", doc.getText().trim());getRuns | |
public RunCollection getRuns() | |
Example:
Shows how to determine the revision type of an inline node.Document doc = new Document(getMyDir() + "Revision runs.docx"); // When we edit the document while the "Track Changes" option, found in via Review -> Tracking, // is turned on in Microsoft Word, the changes we apply count as revisions. // When editing a document using Aspose.Words, we can begin tracking revisions by // invoking the document's "StartTrackRevisions" method and stop tracking by using the "StopTrackRevisions" method. // We can either accept revisions to assimilate them into the document // or reject them to change the proposed change effectively. Assert.assertEquals(6, doc.getRevisions().getCount()); // The parent node of a revision is the run that the revision concerns. A Run is an Inline node. Run run = (Run) doc.getRevisions().get(0).getParentNode(); Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // Below are five types of revisions that can flag an Inline node. // 1 - An "insert" revision: // This revision occurs when we insert text while tracking changes. Assert.assertTrue(runs.get(2).isInsertRevision()); // 2 - A "format" revision: // This revision occurs when we change the formatting of text while tracking changes. Assert.assertTrue(runs.get(2).isFormatRevision()); // 3 - A "move from" revision: // When we highlight text in Microsoft Word, and then drag it to a different place in the document // while tracking changes, two revisions appear. // The "move from" revision is a copy of the text originally before we moved it. Assert.assertTrue(runs.get(4).isMoveFromRevision()); // 4 - A "move to" revision: // The "move to" revision is the text that we moved in its new position in the document. // "Move from" and "move to" revisions appear in pairs for every move revision we carry out. // Accepting a move revision deletes the "move from" revision and its text, // and keeps the text from the "move to" revision. // Rejecting a move revision conversely keeps the "move from" revision and deletes the "move to" revision. Assert.assertTrue(runs.get(1).isMoveToRevision()); // 5 - A "delete" revision: // This revision occurs when we delete text while tracking changes. When we delete text like this, // it will stay in the document as a revision until we either accept the revision, // which will delete the text for good, or reject the revision, which will keep the text we deleted where it was. Assert.assertTrue(runs.get(5).isDeleteRevision());
| Method Detail |
|---|
accept | |
public boolean accept(DocumentVisitor visitor) throws java.lang.Exception | |
Enumerates over this node and all of its children. Each node calls a corresponding method on
For more info see the Visitor design pattern.
visitor - The visitor that will visit the nodes.Example:
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
public void removeHiddenContentFromDocument() throws Exception {
Document doc = new Document(getMyDir() + "Hidden content.docx");
RemoveHiddenContentVisitor hiddenContentRemover = new RemoveHiddenContentVisitor();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 4, true);
para.accept(hiddenContentRemover);
// 2 - Table node:
Table table = doc.getFirstSection().getBody().getTables().get(0);
table.accept(hiddenContentRemover);
// 3 - Document node:
doc.accept(hiddenContentRemover);
doc.save(getArtifactsDir() + "Font.RemoveHiddenContentFromDocument.docx");
}
/// <summary>
/// Removes all visited nodes marked as "hidden content".
/// </summary>
public static class RemoveHiddenContentVisitor extends DocumentVisitor {
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
if (fieldStart.getFont().getHidden())
fieldStart.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
if (fieldEnd.getFont().getHidden())
fieldEnd.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
if (fieldSeparator.getFont().getHidden())
fieldSeparator.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
if (run.getFont().getHidden())
run.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph node is encountered in the document.
/// </summary>
public int visitParagraphStart(Paragraph paragraph) {
if (paragraph.getParagraphBreakFont().getHidden())
paragraph.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField is encountered in the document.
/// </summary>
public int visitFormField(FormField formField) {
if (formField.getFont().getHidden())
formField.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a GroupShape is encountered in the document.
/// </summary>
public int visitGroupShapeStart(GroupShape groupShape) {
if (groupShape.getFont().getHidden())
groupShape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Shape is encountered in the document.
/// </summary>
public int visitShapeStart(Shape shape) {
if (shape.getFont().getHidden())
shape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Comment is encountered in the document.
/// </summary>
public int visitCommentStart(Comment comment) {
if (comment.getFont().getHidden())
comment.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote is encountered in the document.
/// </summary>
public int visitFootnoteStart(Footnote footnote) {
if (footnote.getFont().getHidden())
footnote.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialCharacter is encountered in the document.
/// </summary>
public int visitSpecialChar(SpecialChar specialChar) {
if (specialChar.getFont().getHidden())
specialChar.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Table node is ended in the document.
/// </summary>
public int visitTableEnd(Table table) {
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table.hasChildNodes())
table.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Cell node is ended in the document.
/// </summary>
public int visitCellEnd(Cell cell) {
if (!cell.hasChildNodes() && cell.getParentNode() != null)
cell.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Row node is ended in the document.
/// </summary>
public int visitRowEnd(Row row) {
if (!row.hasChildNodes() && row.getParentNode() != null)
row.remove();
return VisitorAction.CONTINUE;
}
}acceptEnd | |
public int acceptEnd(DocumentVisitor visitor) throws java.lang.Exception | |
visitor - The document visitor.Example:
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
public void removeHiddenContentFromDocument() throws Exception {
Document doc = new Document(getMyDir() + "Hidden content.docx");
RemoveHiddenContentVisitor hiddenContentRemover = new RemoveHiddenContentVisitor();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 4, true);
para.accept(hiddenContentRemover);
// 2 - Table node:
Table table = doc.getFirstSection().getBody().getTables().get(0);
table.accept(hiddenContentRemover);
// 3 - Document node:
doc.accept(hiddenContentRemover);
doc.save(getArtifactsDir() + "Font.RemoveHiddenContentFromDocument.docx");
}
/// <summary>
/// Removes all visited nodes marked as "hidden content".
/// </summary>
public static class RemoveHiddenContentVisitor extends DocumentVisitor {
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
if (fieldStart.getFont().getHidden())
fieldStart.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
if (fieldEnd.getFont().getHidden())
fieldEnd.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
if (fieldSeparator.getFont().getHidden())
fieldSeparator.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
if (run.getFont().getHidden())
run.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph node is encountered in the document.
/// </summary>
public int visitParagraphStart(Paragraph paragraph) {
if (paragraph.getParagraphBreakFont().getHidden())
paragraph.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField is encountered in the document.
/// </summary>
public int visitFormField(FormField formField) {
if (formField.getFont().getHidden())
formField.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a GroupShape is encountered in the document.
/// </summary>
public int visitGroupShapeStart(GroupShape groupShape) {
if (groupShape.getFont().getHidden())
groupShape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Shape is encountered in the document.
/// </summary>
public int visitShapeStart(Shape shape) {
if (shape.getFont().getHidden())
shape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Comment is encountered in the document.
/// </summary>
public int visitCommentStart(Comment comment) {
if (comment.getFont().getHidden())
comment.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote is encountered in the document.
/// </summary>
public int visitFootnoteStart(Footnote footnote) {
if (footnote.getFont().getHidden())
footnote.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialCharacter is encountered in the document.
/// </summary>
public int visitSpecialChar(SpecialChar specialChar) {
if (specialChar.getFont().getHidden())
specialChar.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Table node is ended in the document.
/// </summary>
public int visitTableEnd(Table table) {
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table.hasChildNodes())
table.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Cell node is ended in the document.
/// </summary>
public int visitCellEnd(Cell cell) {
if (!cell.hasChildNodes() && cell.getParentNode() != null)
cell.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Row node is ended in the document.
/// </summary>
public int visitRowEnd(Row row) {
if (!row.hasChildNodes() && row.getParentNode() != null)
row.remove();
return VisitorAction.CONTINUE;
}
}acceptStart | |
public int acceptStart(DocumentVisitor visitor) throws java.lang.Exception | |
visitor - The document visitor.Example:
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
public void removeHiddenContentFromDocument() throws Exception {
Document doc = new Document(getMyDir() + "Hidden content.docx");
RemoveHiddenContentVisitor hiddenContentRemover = new RemoveHiddenContentVisitor();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 4, true);
para.accept(hiddenContentRemover);
// 2 - Table node:
Table table = doc.getFirstSection().getBody().getTables().get(0);
table.accept(hiddenContentRemover);
// 3 - Document node:
doc.accept(hiddenContentRemover);
doc.save(getArtifactsDir() + "Font.RemoveHiddenContentFromDocument.docx");
}
/// <summary>
/// Removes all visited nodes marked as "hidden content".
/// </summary>
public static class RemoveHiddenContentVisitor extends DocumentVisitor {
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
if (fieldStart.getFont().getHidden())
fieldStart.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
if (fieldEnd.getFont().getHidden())
fieldEnd.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
if (fieldSeparator.getFont().getHidden())
fieldSeparator.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
if (run.getFont().getHidden())
run.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph node is encountered in the document.
/// </summary>
public int visitParagraphStart(Paragraph paragraph) {
if (paragraph.getParagraphBreakFont().getHidden())
paragraph.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField is encountered in the document.
/// </summary>
public int visitFormField(FormField formField) {
if (formField.getFont().getHidden())
formField.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a GroupShape is encountered in the document.
/// </summary>
public int visitGroupShapeStart(GroupShape groupShape) {
if (groupShape.getFont().getHidden())
groupShape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Shape is encountered in the document.
/// </summary>
public int visitShapeStart(Shape shape) {
if (shape.getFont().getHidden())
shape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Comment is encountered in the document.
/// </summary>
public int visitCommentStart(Comment comment) {
if (comment.getFont().getHidden())
comment.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote is encountered in the document.
/// </summary>
public int visitFootnoteStart(Footnote footnote) {
if (footnote.getFont().getHidden())
footnote.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialCharacter is encountered in the document.
/// </summary>
public int visitSpecialChar(SpecialChar specialChar) {
if (specialChar.getFont().getHidden())
specialChar.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Table node is ended in the document.
/// </summary>
public int visitTableEnd(Table table) {
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table.hasChildNodes())
table.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Cell node is ended in the document.
/// </summary>
public int visitCellEnd(Cell cell) {
if (!cell.hasChildNodes() && cell.getParentNode() != null)
cell.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Row node is ended in the document.
/// </summary>
public int visitRowEnd(Row row) {
if (!row.hasChildNodes() && row.getParentNode() != null)
row.remove();
return VisitorAction.CONTINUE;
}
}appendField | |
public Field appendField(int fieldType, boolean updateField) throws java.lang.Exception | |
fieldType - A updateField - Specifies whether to update the field immediately.Example:
Shows various ways of appending fields to a paragraph.
Document doc = new Document();
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of appending a field to the end of a paragraph.
// 1 - Append a DATE field using a field type, and then update it:
paragraph.appendField(FieldType.FIELD_DATE, true);
// 2 - Append a TIME field using a field code:
paragraph.appendField(" TIME \\@ \"HH:mm:ss\" ");
// 3 - Append a QUOTE field using a field code, and get it to display a placeholder value:
paragraph.appendField(" QUOTE \"Real value\"", "Placeholder value");
Assert.assertEquals("Placeholder value", doc.getRange().getFields().get(2).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals("Real value", doc.getRange().getFields().get(2).getResult());
doc.save(getArtifactsDir() + "Paragraph.AppendField.docx");appendField | |
public Field appendField(java.lang.String fieldCode) throws java.lang.Exception | |
fieldCode - The field code to append (without curly braces).Example:
Shows various ways of appending fields to a paragraph.
Document doc = new Document();
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of appending a field to the end of a paragraph.
// 1 - Append a DATE field using a field type, and then update it:
paragraph.appendField(FieldType.FIELD_DATE, true);
// 2 - Append a TIME field using a field code:
paragraph.appendField(" TIME \\@ \"HH:mm:ss\" ");
// 3 - Append a QUOTE field using a field code, and get it to display a placeholder value:
paragraph.appendField(" QUOTE \"Real value\"", "Placeholder value");
Assert.assertEquals("Placeholder value", doc.getRange().getFields().get(2).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals("Real value", doc.getRange().getFields().get(2).getResult());
doc.save(getArtifactsDir() + "Paragraph.AppendField.docx");appendField | |
public Field appendField(java.lang.String fieldCode, java.lang.String fieldValue) | |
fieldCode - The field code to append (without curly braces).fieldValue - The field value to append. Pass null for fields that do not have a value.Example:
Shows various ways of appending fields to a paragraph.
Document doc = new Document();
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of appending a field to the end of a paragraph.
// 1 - Append a DATE field using a field type, and then update it:
paragraph.appendField(FieldType.FIELD_DATE, true);
// 2 - Append a TIME field using a field code:
paragraph.appendField(" TIME \\@ \"HH:mm:ss\" ");
// 3 - Append a QUOTE field using a field code, and get it to display a placeholder value:
paragraph.appendField(" QUOTE \"Real value\"", "Placeholder value");
Assert.assertEquals("Placeholder value", doc.getRange().getFields().get(2).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals("Real value", doc.getRange().getFields().get(2).getResult());
doc.save(getArtifactsDir() + "Paragraph.AppendField.docx");deepClone | → inherited from Node |
public Node deepClone(boolean isCloneChildren) | |
This method serves as a copy constructor for nodes. The cloned node has no parent, but belongs to the same document as the original node.
This method always performs a deep copy of the node. The isCloneChildren parameter specifies whether to perform copy all child nodes as well.
isCloneChildren - True to recursively clone the subtree under the specified node;
false to clone only the node itself.Example:
Shows how to clone a composite node.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
para.appendChild(new Run(doc, "Hello world!"));
// Below are two ways of cloning a composite node.
// 1 - Create a clone of a node, and create a clone of each of its child nodes as well.
Node cloneWithChildren = para.deepClone(true);
Assert.assertTrue(((CompositeNode) cloneWithChildren).hasChildNodes());
Assert.assertEquals("Hello world!", cloneWithChildren.getText().trim());
// 2 - Create a clone of a node just by itself without any children.
Node cloneWithoutChildren = para.deepClone(false);
Assert.assertFalse(((CompositeNode) cloneWithoutChildren).hasChildNodes());
Assert.assertEquals("", cloneWithoutChildren.getText().trim());getAncestor | → inherited from Node |
public CompositeNode getAncestor(int ancestorType) | |
ancestorType - A null if no ancestor of this type was found.Example:
Shows how to find out if a tables are nested.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Nested tables.docx");
NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
for (int i = 0; i < tables.getCount(); i++) {
Table table = (Table) tables.get(i);
// Find out if any cells in the table have other tables as children.
int count = getChildTableCount(table);
System.out.print(MessageFormat.format("Table #{0} has {1} tables directly within its cells", i, count));
// Find out if the table is nested inside another table, and, if so, 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}", i, tableDepth));
else
System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", i));
}
}
// 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;
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
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 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 childTableCount = 0;
for (Row row : table.getRows()) {
for (Cell cell : row.getCells()) {
TableCollection childTables = cell.getTables();
if (childTables.getCount() > 0) childTableCount++;
}
}
return childTableCount;
}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.null if no ancestor of this type was found.Example:
Shows how to find out if a tables are nested.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Nested tables.docx");
NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
for (int i = 0; i < tables.getCount(); i++) {
Table table = (Table) tables.get(i);
// Find out if any cells in the table have other tables as children.
int count = getChildTableCount(table);
System.out.print(MessageFormat.format("Table #{0} has {1} tables directly within its cells", i, count));
// Find out if the table is nested inside another table, and, if so, 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}", i, tableDepth));
else
System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", i));
}
}
// 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;
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
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 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 childTableCount = 0;
for (Row row : table.getRows()) {
for (Cell cell : row.getCells()) {
TableCollection childTables = cell.getTables();
if (childTables.getCount() > 0) childTableCount++;
}
}
return childTableCount;
}getChild | → inherited from CompositeNode |
public Node getChild(int nodeType, int index, boolean isDeep) | |
If index is out of range, a null is returned.
false and false).nodeType - A index - Zero based index of the child node to select.
Negative indexes are also allowed and indicate access from the end,
that is -1 means the last node.isDeep - true to select from all child nodes recursively;
false to select only among immediate children. See remarks for more info.null if no matching node is found.Example:
Shows how to traverse through a composite node's collection of child nodes.
Document doc = new Document();
// Add two runs and one shape as child nodes to the first paragraph of this document.
Paragraph paragraph = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 0, true);
paragraph.appendChild(new Run(doc, "Hello world! "));
Shape shape = new Shape(doc, ShapeType.RECTANGLE);
shape.setWidth(200.0);
shape.setHeight(200.0);
// Note that the 'CustomNodeId' is not saved to an output file and exists only during the node lifetime.
shape.setCustomNodeId(100);
shape.setWrapType(WrapType.INLINE);
paragraph.appendChild(shape);
paragraph.appendChild(new Run(doc, "Hello again!"));
// Iterate through the paragraph's collection of immediate children,
// and print any runs or shapes that we find within.
NodeCollection children = paragraph.getChildNodes(NodeType.ANY, false);
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, false).getCount());
for (Node child : (Iterable<Node>) children)
switch (child.getNodeType()) {
case NodeType.RUN:
System.out.println("Run contents:");
System.out.println(MessageFormat.format("\t\"{0}\"", child.getText().trim()));
break;
case NodeType.SHAPE:
Shape childShape = (Shape)child;
System.out.println("Shape:");
System.out.println(MessageFormat.format("\t{0}, {1}x{2}", childShape.getShapeType(), childShape.getWidth(), childShape.getHeight()));
break;
}Example:
Shows how to apply the properties of a table's style directly to the table's elements.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Table table = builder.startTable();
builder.insertCell();
builder.write("Hello world!");
builder.endTable();
TableStyle tableStyle = (TableStyle) doc.getStyles().add(StyleType.TABLE, "MyTableStyle1");
tableStyle.setRowStripe(3);
tableStyle.setCellSpacing(5.0);
tableStyle.getShading().setBackgroundPatternColor(Color.WHITE);
tableStyle.getBorders().setColor(Color.BLUE);
tableStyle.getBorders().setLineStyle(LineStyle.DOT_DASH);
table.setStyle(tableStyle);
// This method concerns table style properties such as the ones we set above.
doc.expandTableStylesToDirectFormatting();
doc.save(getArtifactsDir() + "Document.TableStyleToDirectFormatting.docx");getChildNodes | → inherited from CompositeNode |
public NodeCollection getChildNodes(int nodeType, boolean isDeep) | |
The collection of nodes returned by this method is always live.
A live collection is always in sync with the document. For example, if you selected all sections in a document and enumerate through the collection deleting the sections, the section is removed from the collection immediately when it is removed from the document.
nodeType - A isDeep - true to select from all child nodes recursively;
false to select only among immediate children. Example:
Shows how to add, update and delete child nodes in a CompositeNode's collection of children.
Document doc = new Document();
// An empty document, by default, has one paragraph.
Assert.assertEquals(1, doc.getFirstSection().getBody().getParagraphs().getCount());
// Composite nodes such as our paragraph can contain other composite and inline nodes as children.
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
Run paragraphText = new Run(doc, "Initial text. ");
paragraph.appendChild(paragraphText);
// Create three more run nodes.
Run run1 = new Run(doc, "Run 1. ");
Run run2 = new Run(doc, "Run 2. ");
Run run3 = new Run(doc, "Run 3. ");
// The document body will not display these runs until we insert them into a composite node
// that itself is a part of the document's node tree, as we did with the first run.
// We can determine where the text contents of nodes that we insert
// appears in the document by specifying an insertion location relative to another node in the paragraph.
Assert.assertEquals("Initial text.", paragraph.getText().trim());
// Insert the second run into the paragraph in front of the initial run.
paragraph.insertBefore(run2, paragraphText);
Assert.assertEquals("Run 2. Initial text.", paragraph.getText().trim());
// Insert the third run after the initial run.
paragraph.insertAfter(run3, paragraphText);
Assert.assertEquals("Run 2. Initial text. Run 3.", paragraph.getText().trim());
// Insert the first run to the start of the paragraph's child nodes collection.
paragraph.prependChild(run1);
Assert.assertEquals("Run 1. Run 2. Initial text. Run 3.", paragraph.getText().trim());
Assert.assertEquals(4, paragraph.getChildNodes(NodeType.ANY, true).getCount());
// We can modify the contents of the run by editing and deleting existing child nodes.
((Run) paragraph.getChildNodes(NodeType.RUN, true).get(1)).setText("Updated run 2. ");
paragraph.getChildNodes(NodeType.RUN, true).remove(paragraphText);
Assert.assertEquals("Run 1. Updated run 2. Run 3.", paragraph.getText().trim());
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, true).getCount());Example:
Shows how to traverse through a composite node's collection of child nodes.
Document doc = new Document();
// Add two runs and one shape as child nodes to the first paragraph of this document.
Paragraph paragraph = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 0, true);
paragraph.appendChild(new Run(doc, "Hello world! "));
Shape shape = new Shape(doc, ShapeType.RECTANGLE);
shape.setWidth(200.0);
shape.setHeight(200.0);
// Note that the 'CustomNodeId' is not saved to an output file and exists only during the node lifetime.
shape.setCustomNodeId(100);
shape.setWrapType(WrapType.INLINE);
paragraph.appendChild(shape);
paragraph.appendChild(new Run(doc, "Hello again!"));
// Iterate through the paragraph's collection of immediate children,
// and print any runs or shapes that we find within.
NodeCollection children = paragraph.getChildNodes(NodeType.ANY, false);
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, false).getCount());
for (Node child : (Iterable<Node>) children)
switch (child.getNodeType()) {
case NodeType.RUN:
System.out.println("Run contents:");
System.out.println(MessageFormat.format("\t\"{0}\"", child.getText().trim()));
break;
case NodeType.SHAPE:
Shape childShape = (Shape)child;
System.out.println("Shape:");
System.out.println(MessageFormat.format("\t{0}, {1}x{2}", childShape.getShapeType(), childShape.getWidth(), childShape.getHeight()));
break;
}Example:
Shows how to extract images from a document, and save them to the local file system as individual files.
Document doc = new Document(getMyDir() + "Images.docx");
// Get the collection of shapes from the document,
// and save the image data of every shape with an image as a file to the local file system.
NodeCollection shapes = doc.getChildNodes(NodeType.SHAPE, true);
int imageIndex = 0;
for (Shape shape : (Iterable<Shape>) shapes) {
if (shape.hasImage()) {
// The image data of shapes may contain images of many possible image formats.
// We can determine a file extension for each image automatically, based on its format.
String imageFileName = MessageFormat.format("File.ExtractImages.{0}{1}", imageIndex, FileFormatUtil.imageTypeToExtension(shape.getImageData().getImageType()));
shape.getImageData().save(getArtifactsDir() + imageFileName);
imageIndex++;
}
}Example:
Shows how to print all of a document's comments and their replies.
Document doc = new Document(getMyDir() + "Comments.docx");
NodeCollection comments = doc.getChildNodes(NodeType.COMMENT, true);
// If a comment has no ancestor, it is a "top-level" comment as opposed to a reply-type comment.
// Print all top-level comments along with any replies they may have.
for (Comment comment : (Iterable<Comment>) comments) {
if (comment.getAncestor() == null) {
System.out.println("Top-level comment:");
System.out.println("\t\"{comment.GetText().Trim()}\", by {comment.Author}");
System.out.println("Has {comment.Replies.Count} replies");
for (Comment commentReply : comment.getReplies()) {
System.out.println("\t\"{commentReply.GetText().Trim()}\", by {commentReply.Author}");
}
System.out.println();
}
}getEffectiveTabStops | |
public TabStop[] getEffectiveTabStops() | |
Example:
Shows how to set custom tab stops for a paragraph.Document doc = new Document(); Paragraph para = doc.getFirstSection().getBody().getFirstParagraph(); // If we are in a paragraph with no tab stops in this collection, // the cursor will jump 36 points each time we press the Tab key in Microsoft Word. Assert.assertEquals(0, doc.getFirstSection().getBody().getFirstParagraph().getEffectiveTabStops().length); // We can add custom tab stops in Microsoft Word if we enable the ruler via the "View" tab. // Each unit on this ruler is two default tab stops, which is 72 points. // We can add custom tab stops programmatically like this. TabStopCollection tabStops = doc.getFirstSection().getBody().getFirstParagraph().getParagraphFormat().getTabStops(); tabStops.add(72.0, TabAlignment.LEFT, TabLeader.DOTS); tabStops.add(216.0, TabAlignment.CENTER, TabLeader.DASHES); tabStops.add(360.0, TabAlignment.RIGHT, TabLeader.LINE); // We can see these tab stops in Microsoft Word by enabling the ruler via "View" -> "Show" -> "Ruler". Assert.assertEquals(3, para.getEffectiveTabStops().length); // Any tab characters we add will make use of the tab stops on the ruler and may, // depending on the tab leader's value, leave a line between the tab departure and arrival destinations. para.appendChild(new Run(doc, "\tTab 1\tTab 2\tTab 3")); doc.save(getArtifactsDir() + "Paragraph.TabStops.docx");
getText | |
public java.lang.String getText() | |
The text of all child nodes is concatenated and the end of paragraph character is appended as follows:
The returned string includes all control and special characters as described in
Example:
Shows how to add, update and delete child nodes in a CompositeNode's collection of children.
Document doc = new Document();
// An empty document, by default, has one paragraph.
Assert.assertEquals(1, doc.getFirstSection().getBody().getParagraphs().getCount());
// Composite nodes such as our paragraph can contain other composite and inline nodes as children.
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
Run paragraphText = new Run(doc, "Initial text. ");
paragraph.appendChild(paragraphText);
// Create three more run nodes.
Run run1 = new Run(doc, "Run 1. ");
Run run2 = new Run(doc, "Run 2. ");
Run run3 = new Run(doc, "Run 3. ");
// The document body will not display these runs until we insert them into a composite node
// that itself is a part of the document's node tree, as we did with the first run.
// We can determine where the text contents of nodes that we insert
// appears in the document by specifying an insertion location relative to another node in the paragraph.
Assert.assertEquals("Initial text.", paragraph.getText().trim());
// Insert the second run into the paragraph in front of the initial run.
paragraph.insertBefore(run2, paragraphText);
Assert.assertEquals("Run 2. Initial text.", paragraph.getText().trim());
// Insert the third run after the initial run.
paragraph.insertAfter(run3, paragraphText);
Assert.assertEquals("Run 2. Initial text. Run 3.", paragraph.getText().trim());
// Insert the first run to the start of the paragraph's child nodes collection.
paragraph.prependChild(run1);
Assert.assertEquals("Run 1. Run 2. Initial text. Run 3.", paragraph.getText().trim());
Assert.assertEquals(4, paragraph.getChildNodes(NodeType.ANY, true).getCount());
// We can modify the contents of the run by editing and deleting existing child nodes.
((Run) paragraph.getChildNodes(NodeType.RUN, true).get(1)).setText("Updated run 2. ");
paragraph.getChildNodes(NodeType.RUN, true).remove(paragraphText);
Assert.assertEquals("Run 1. Updated run 2. Run 3.", paragraph.getText().trim());
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, true).getCount());indexOf | → inherited from CompositeNode |
public int indexOf(Node child) | |
Example:
Shows how to get the index of a given child node from its parent.Document doc = new Document(getMyDir() + "Rendering.docx"); Body body = doc.getFirstSection().getBody(); // Retrieve the index of the last paragraph in the body of the first section. Assert.assertEquals(24, body.getChildNodes(NodeType.ANY, false).indexOf(body.getLastParagraph()));
insertField | |
public Field insertField(int fieldType, boolean updateField, Node refNode, boolean isAfter) throws java.lang.Exception | |
fieldType - A updateField - Specifies whether to update the field immediately.refNode - Reference node inside this paragraph (if refNode is null, then appends to the end of the paragraph).isAfter - Whether to insert the field after or before reference node.Example:
Shows various ways of adding fields to a paragraph.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of inserting a field into a paragraph.
// 1 - Insert an AUTHOR field into a paragraph after one of the paragraph's child nodes:
Run run = new Run(doc);
{
run.setText("This run was written by ");
}
para.appendChild(run);
doc.getBuiltInDocumentProperties().get("Author").setValue("John Doe");
para.insertField(FieldType.FIELD_AUTHOR, true, run, true);
// 2 - Insert a QUOTE field after one of the paragraph's child nodes:
run = new Run(doc);
{
run.setText(".");
}
para.appendChild(run);
Field field = para.insertField(" QUOTE \" Real value\" ", run, true);
// 3 - Insert a QUOTE field before one of the paragraph's child nodes,
// and get it to display a placeholder value:
para.insertField(" QUOTE \" Real value.\"", " Placeholder value.", field.getStart(), false);
Assert.assertEquals(" Placeholder value.", doc.getRange().getFields().get(1).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals(" Real value.", doc.getRange().getFields().get(1).getResult());
doc.save(getArtifactsDir() + "Paragraph.InsertField.docx");insertField | |
public Field insertField(java.lang.String fieldCode, Node refNode, boolean isAfter) throws java.lang.Exception | |
fieldCode - The field code to insert (without curly braces).refNode - Reference node inside this paragraph (if refNode is null, then appends to the end of the paragraph).isAfter - Whether to insert the field after or before reference node.Example:
Shows various ways of adding fields to a paragraph.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of inserting a field into a paragraph.
// 1 - Insert an AUTHOR field into a paragraph after one of the paragraph's child nodes:
Run run = new Run(doc);
{
run.setText("This run was written by ");
}
para.appendChild(run);
doc.getBuiltInDocumentProperties().get("Author").setValue("John Doe");
para.insertField(FieldType.FIELD_AUTHOR, true, run, true);
// 2 - Insert a QUOTE field after one of the paragraph's child nodes:
run = new Run(doc);
{
run.setText(".");
}
para.appendChild(run);
Field field = para.insertField(" QUOTE \" Real value\" ", run, true);
// 3 - Insert a QUOTE field before one of the paragraph's child nodes,
// and get it to display a placeholder value:
para.insertField(" QUOTE \" Real value.\"", " Placeholder value.", field.getStart(), false);
Assert.assertEquals(" Placeholder value.", doc.getRange().getFields().get(1).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals(" Real value.", doc.getRange().getFields().get(1).getResult());
doc.save(getArtifactsDir() + "Paragraph.InsertField.docx");insertField | |
public Field insertField(java.lang.String fieldCode, java.lang.String fieldValue, Node refNode, boolean isAfter) | |
fieldCode - The field code to insert (without curly braces).fieldValue - The field value to insert. Pass null for fields that do not have a value.refNode - Reference node inside this paragraph (if refNode is null, then appends to the end of the paragraph).isAfter - Whether to insert the field after or before reference node.Example:
Shows various ways of adding fields to a paragraph.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of inserting a field into a paragraph.
// 1 - Insert an AUTHOR field into a paragraph after one of the paragraph's child nodes:
Run run = new Run(doc);
{
run.setText("This run was written by ");
}
para.appendChild(run);
doc.getBuiltInDocumentProperties().get("Author").setValue("John Doe");
para.insertField(FieldType.FIELD_AUTHOR, true, run, true);
// 2 - Insert a QUOTE field after one of the paragraph's child nodes:
run = new Run(doc);
{
run.setText(".");
}
para.appendChild(run);
Field field = para.insertField(" QUOTE \" Real value\" ", run, true);
// 3 - Insert a QUOTE field before one of the paragraph's child nodes,
// and get it to display a placeholder value:
para.insertField(" QUOTE \" Real value.\"", " Placeholder value.", field.getStart(), false);
Assert.assertEquals(" Placeholder value.", doc.getRange().getFields().get(1).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals(" Real value.", doc.getRange().getFields().get(1).getResult());
doc.save(getArtifactsDir() + "Paragraph.InsertField.docx");iterator | → inherited from CompositeNode |
public java.util.Iterator<Node> iterator() | |
Example:
Shows how to print all of a document's comments and their replies.
Document doc = new Document(getMyDir() + "Comments.docx");
NodeCollection comments = doc.getChildNodes(NodeType.COMMENT, true);
// If a comment has no ancestor, it is a "top-level" comment as opposed to a reply-type comment.
// Print all top-level comments along with any replies they may have.
for (Comment comment : (Iterable<Comment>) comments) {
if (comment.getAncestor() == null) {
System.out.println("Top-level comment:");
System.out.println("\t\"{comment.GetText().Trim()}\", by {comment.Author}");
System.out.println("Has {comment.Replies.Count} replies");
for (Comment commentReply : comment.getReplies()) {
System.out.println("\t\"{commentReply.GetText().Trim()}\", by {commentReply.Author}");
}
System.out.println();
}
}joinRunsWithSameFormatting | |
public int joinRunsWithSameFormatting() | |
Example:
Shows how to simplify paragraphs by merging superfluous runs.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Insert four runs of text into the paragraph.
builder.write("Run 1. ");
builder.write("Run 2. ");
builder.write("Run 3. ");
builder.write("Run 4. ");
// If we open this document in Microsoft Word, the paragraph will look like one seamless text body.
// However, it will consist of four separate runs with the same formatting. Fragmented paragraphs like this
// may occur when we manually edit parts of one paragraph many times in Microsoft Word.
Paragraph para = builder.getCurrentParagraph();
Assert.assertEquals(4, para.getRuns().getCount());
// Change the style of the last run to set it apart from the first three.
para.getRuns().get(3).getFont().setStyleIdentifier(StyleIdentifier.EMPHASIS);
// We can run the "JoinRunsWithSameFormatting" method to optimize the document's contents
// by merging similar runs into one, reducing their overall count.
// This method also returns the number of runs that this method merged.
// These two merges occurred to combine Runs #1, #2, and #3,
// while leaving out Run #4 because it has an incompatible style.
Assert.assertEquals(2, para.joinRunsWithSameFormatting());
// The number of runs left will equal the original count
// minus the number of run merges that the "JoinRunsWithSameFormatting" method carried out.
Assert.assertEquals(2, para.getRuns().getCount());
Assert.assertEquals("Run 1. Run 2. Run 3. ", para.getRuns().get(0).getText());
Assert.assertEquals("Run 4. ", para.getRuns().get(1).getText());nextPreOrder | → inherited from Node |
public Node nextPreOrder(Node rootNode) | |
rootNode - The top node (limit) of traversal.Example:
Shows how to traverse the document's node tree using the pre-order traversal algorithm, and delete any encountered shape with an image.
Document doc = new Document(getMyDir() + "Images.docx");
ArrayList<Shape> shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(9, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));
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) curNode).hasImage())
curNode.remove();
curNode = nextNode;
}
shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(0, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));previousPreOrder | → inherited from Node |
public Node previousPreOrder(Node rootNode) | |
rootNode - The top node (limit) of traversal.Example:
Shows how to traverse the document's node tree using the pre-order traversal algorithm, and delete any encountered shape with an image.
Document doc = new Document(getMyDir() + "Images.docx");
ArrayList<Shape> shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(9, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));
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) curNode).hasImage())
curNode.remove();
curNode = nextNode;
}
shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(0, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));remove | → inherited from Node |
public void remove() | |
Example:
Shows how to delete all shapes with images from a document.
Document doc = new Document(getMyDir() + "Images.docx");
ArrayList<Shape> shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(9, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));
for (Shape shape : shapes)
if (shape.hasImage())
shape.remove();
shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(0, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));Example:
Shows how to remove all child nodes of a specific type from a composite node.
Document doc = new Document(getMyDir() + "Tables.docx");
Assert.assertEquals(2, doc.getChildNodes(NodeType.TABLE, true).getCount());
Node curNode = doc.getFirstSection().getBody().getFirstChild();
while (curNode != null) {
// Save the next sibling node as a variable in case we want to move to it after deleting this node.
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();
}
curNode = nextNode;
}
Assert.assertEquals(0, doc.getChildNodes(NodeType.TABLE, true).getCount());removeAllChildren | → inherited from CompositeNode |
public void removeAllChildren() | |
Example:
Shows how to construct an Aspose.Words document by hand.
Document doc = new Document();
// A blank document contains one section, one body and one paragraph.
// Call the "RemoveAllChildren" method to remove all those nodes,
// and end up with a document node with no children.
doc.removeAllChildren();
// This document now has no composite child nodes that we can add content to.
// If we wish to edit it, we will need to repopulate its node collection.
// First, create a new section, and then append it as a child to the root document node.
Section section = new Section(doc);
doc.appendChild(section);
// Set some page setup properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain and display all its contents
// on the page between the section's header and footer.
Body body = new Body(doc);
section.appendChild(body);
// Create a paragraph, set some formatting properties, and then append it as a child to the body.
Paragraph para = new Paragraph(doc);
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
body.appendChild(para);
// Finally, add some content to do the document. Create a run,
// set its appearance and contents, and then append it as a child to the paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!", doc.getText().trim());
doc.save(getArtifactsDir() + "Section.CreateManually.docx");removeSmartTags | → inherited from CompositeNode |
public void removeSmartTags() | |
Example:
Shows how to create smart tags.
public void create() throws Exception {
Document doc = new Document();
// A smart tag appears in a document with Microsoft Word recognizes a part of its text as some form of data,
// such as a name, date, or address, and converts it to a hyperlink that displays a purple dotted underline.
SmartTag smartTag = new SmartTag(doc);
// Smart tags are composite nodes that contain their recognized text in its entirety.
// Add contents to this smart tag manually.
smartTag.appendChild(new Run(doc, "May 29, 2019"));
// Microsoft Word may recognize the above contents as being a date.
// Smart tags use the "Element" property to reflect the type of data they contain.
smartTag.setElement("date");
// Some smart tag types process their contents further into custom XML properties.
smartTag.getProperties().add(new CustomXmlProperty("Day", "", "29"));
smartTag.getProperties().add(new CustomXmlProperty("Month", "", "5"));
smartTag.getProperties().add(new CustomXmlProperty("Year", "", "2019"));
// Set the smart tag's URI to the default value.
smartTag.setUri("urn:schemas-microsoft-com:office:smarttags");
doc.getFirstSection().getBody().getFirstParagraph().appendChild(smartTag);
doc.getFirstSection().getBody().getFirstParagraph().appendChild(new Run(doc, " is a date. "));
// Create another smart tag for a stock ticker.
smartTag = new SmartTag(doc);
smartTag.setElement("stockticker");
smartTag.setUri("urn:schemas-microsoft-com:office:smarttags");
smartTag.appendChild(new Run(doc, "MSFT"));
doc.getFirstSection().getBody().getFirstParagraph().appendChild(smartTag);
doc.getFirstSection().getBody().getFirstParagraph().appendChild(new Run(doc, " is a stock ticker."));
// Print all the smart tags in our document using a document visitor.
doc.accept(new SmartTagPrinter());
// Older versions of Microsoft Word support smart tags.
doc.save(getArtifactsDir() + "SmartTag.Create.doc");
// Use the "RemoveSmartTags" method to remove all smart tags from a document.
Assert.assertEquals(2, doc.getChildNodes(NodeType.SMART_TAG, true).getCount());
doc.removeSmartTags();
Assert.assertEquals(0, doc.getChildNodes(NodeType.SMART_TAG, true).getCount());
}
/// <summary>
/// Prints visited smart tags and their contents.
/// </summary>
private static class SmartTagPrinter extends DocumentVisitor {
/// <summary>
/// Called when a SmartTag node is encountered in the document.
/// </summary>
public /*override*/ /*VisitorAction*/int visitSmartTagStart(SmartTag smartTag) {
System.out.println("Smart tag type: {smartTag.Element}");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when the visiting of a SmartTag node is ended.
/// </summary>
public /*override*/ /*VisitorAction*/int visitSmartTagEnd(SmartTag smartTag) {
System.out.println("\tContents: \"{smartTag.ToString(SaveFormat.Text)}\"");
if (smartTag.getProperties().getCount() == 0) {
System.out.println("\tContains no properties");
} else {
System.out.println("\tProperties: ");
String[] properties = new String[smartTag.getProperties().getCount()];
int index = 0;
for (CustomXmlProperty cxp : smartTag.getProperties())
properties[index++] = MessageFormat.format("\"{0}\" = \"{1}\"", cxp.getName(), cxp.getValue());
System.out.println(StringUtils.join(properties, ", "));
}
return VisitorAction.CONTINUE;
}
}Example:
Removes all smart tags from descendant nodes of a composite node.Document doc = new Document(getMyDir() + "Smart tags.doc"); Assert.assertEquals(8, doc.getChildNodes(NodeType.SMART_TAG, true).getCount()); doc.removeSmartTags(); Assert.assertEquals(0, doc.getChildNodes(NodeType.SMART_TAG, true).getCount());
selectNodes | → inherited from CompositeNode |
public NodeList selectNodes(java.lang.String xpath) | |
Only expressions with element names are supported at the moment. Expressions that use attribute names are not supported.
xpath - The XPath expression.Example:
Shows how to select certain nodes by using an XPath expression.
Document doc = new Document(getMyDir() + "Tables.docx");
// This expression will extract all paragraph nodes,
// which are descendants of any table node in the document.
NodeList nodeList = doc.selectNodes("//Table//Paragraph");
// Iterate through the list with an enumerator and print the contents of every paragraph in each cell of the table.
int index = 0;
Iterator<Node> e = nodeList.iterator();
while (e.hasNext()) {
Node currentNode = e.next();
System.out.println(MessageFormat.format("Table paragraph index {0}, contents: \"{1}\"", index++, currentNode.getText().trim()));
}
// This expression will select any paragraphs that are direct children of any Body node in the document.
nodeList = doc.selectNodes("//Body/Paragraph");
// We can treat the list as an array.
Assert.assertEquals(nodeList.toArray().length, 4);
// Use SelectSingleNode to select the first result of the same expression as above.
Node node = doc.selectSingleNode("//Body/Paragraph");
Assert.assertEquals(Paragraph.class, node.getClass());Example:
Shows how to use an XPath expression to test whether a node is inside a field.
Document doc = new Document(getMyDir() + "Mail merge destination - Northwind employees.docx");
// The NodeList that results from this XPath expression will contain all nodes we find inside a field.
// However, FieldStart and FieldEnd nodes can be on the list if there are nested fields in the path.
// Currently does not find rare fields in which the FieldCode or FieldResult spans across multiple paragraphs.
NodeList resultList =
doc.selectNodes("//FieldStart/following-sibling::node()[following-sibling::FieldEnd]");
Run[] runs = Arrays.stream(resultList.toArray()).filter(n -> n.getNodeType() == NodeType.RUN).toArray(Run[]::new);
Run run = runs[0];
// Check if the specified run is one of the nodes that are inside the field.
System.out.println(MessageFormat.format("Contents of the first Run node that''s part of a field: {0}", run.getText().trim()));selectSingleNode | → inherited from CompositeNode |
public Node selectSingleNode(java.lang.String xpath) | |
Only expressions with element names are supported at the moment. Expressions that use attribute names are not supported.
xpath - The XPath expression.null if no matching node is found.Example:
Shows how to select certain nodes by using an XPath expression.
Document doc = new Document(getMyDir() + "Tables.docx");
// This expression will extract all paragraph nodes,
// which are descendants of any table node in the document.
NodeList nodeList = doc.selectNodes("//Table//Paragraph");
// Iterate through the list with an enumerator and print the contents of every paragraph in each cell of the table.
int index = 0;
Iterator<Node> e = nodeList.iterator();
while (e.hasNext()) {
Node currentNode = e.next();
System.out.println(MessageFormat.format("Table paragraph index {0}, contents: \"{1}\"", index++, currentNode.getText().trim()));
}
// This expression will select any paragraphs that are direct children of any Body node in the document.
nodeList = doc.selectNodes("//Body/Paragraph");
// We can treat the list as an array.
Assert.assertEquals(nodeList.toArray().length, 4);
// Use SelectSingleNode to select the first result of the same expression as above.
Node node = doc.selectSingleNode("//Body/Paragraph");
Assert.assertEquals(Paragraph.class, node.getClass());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.
Document doc = new Document(getMyDir() + "Document.docx");
Node node = doc.getLastSection().getBody().getLastParagraph();
// When we call the ToString method using the html SaveFormat overload,
// it converts the node's contents to their raw html representation.
Assert.assertEquals("<p style=\"margin-top:0pt; margin-bottom:8pt; line-height:108%; font-size:12pt\">" +
"<span style=\"font-family:'Times New Roman'\">Hello World!</span>" +
"</p>", node.toString(SaveFormat.HTML));
// We can also modify the result of this conversion using a SaveOptions object.
HtmlSaveOptions saveOptions = new HtmlSaveOptions();
saveOptions.setExportRelativeFontSize(true);
Assert.assertEquals("<p style=\"margin-top:0pt; margin-bottom:8pt; line-height:108%\">" +
"<span style=\"font-family:'Times New Roman'\">Hello World!</span>" +
"</p>", 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 list labels of all paragraphs that are list items.
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("List item paragraph #{0}", listParaCount));
// This is the text we get when getting when we output this node to text format.
// This text output will omit list labels. 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 the current level of the list. If we have a list with multiple levels,
// this will tell us what position it is on that level.
System.out.println("\tNumerical Id: {label.LabelValue}");
// Combine them together to include the list label with the text in the output.
System.out.println("\tList label combined with text: {label.LabelString} {paragraphText}");
}
}Example:
Exports the content of a node to String in HTML format.
Document doc = new Document(getMyDir() + "Document.docx");
Node node = doc.getLastSection().getBody().getLastParagraph();
// When we call the ToString method using the html SaveFormat overload,
// it converts the node's contents to their raw html representation.
Assert.assertEquals("<p style=\"margin-top:0pt; margin-bottom:8pt; line-height:108%; font-size:12pt\">" +
"<span style=\"font-family:'Times New Roman'\">Hello World!</span>" +
"</p>", node.toString(SaveFormat.HTML));
// We can also modify the result of this conversion using a SaveOptions object.
HtmlSaveOptions saveOptions = new HtmlSaveOptions();
saveOptions.setExportRelativeFontSize(true);
Assert.assertEquals("<p style=\"margin-top:0pt; margin-bottom:8pt; line-height:108%\">" +
"<span style=\"font-family:'Times New Roman'\">Hello World!</span>" +
"</p>", node.toString(saveOptions));Example:
Shows the difference between calling the GetText and ToString methods on a node.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertField("MERGEFIELD Field");
// GetText will retrieve the visible text as well as field codes and special characters.
Assert.assertEquals("\u0013MERGEFIELD Field\u0014«Field»\u0015\f", doc.getText());
// ToString will give us the document's appearance if saved to a passed save format.
Assert.assertEquals("«Field»\r\n", doc.toString(SaveFormat.TEXT));