java.lang.ObjectNode
Inline
SpecialChar
FieldChar
com.aspose.words.FieldEnd
public class FieldEnd
A complete field in a Microsoft Word document is a complex structure consisting of
a field start character, field code, field separator character, field result
and field end character. Some fields only have field start, field code and field end. To easily insert a new field into a document, use the Example:
public void fieldCollection() throws Exception {
// Create a new document and insert some fields
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertField(" DATE \\@ \"dddd, d MMMM yyyy\" ");
builder.insertField(" TIME ");
builder.insertField(" REVNUM ");
builder.insertField(" AUTHOR \"John Doe\" ");
builder.insertField(" SUBJECT \"My Subject\" ");
builder.insertField(" QUOTE \"Hello world!\" ");
doc.updateFields();
// Get the collection that contains all the fields in a document
FieldCollection fields = doc.getRange().getFields();
Assert.assertEquals(fields.getCount(), 6);
// Iterate over the field collection and print contents and type of every field using a custom visitor implementation
FieldVisitor fieldVisitor = new FieldVisitor();
Iterator<Field> fieldEnumerator = fields.iterator();
while (fieldEnumerator.hasNext()) {
if (fieldEnumerator.next() != null) {
Field currentField = fieldEnumerator.next();
currentField.getStart().accept(fieldVisitor);
if (currentField.getSeparator() != null) {
currentField.getSeparator().accept(fieldVisitor);
}
currentField.getEnd().accept(fieldVisitor);
} else {
System.out.println("There are no fields in the document.");
}
}
System.out.println(fieldVisitor.getText());
// Get a field to remove itself
fields.get(0).remove();
Assert.assertEquals(fields.getCount(), 5);
// Remove a field by reference
Field lastField = fields.get(3);
fields.remove(lastField);
Assert.assertEquals(fields.getCount(), 4);
// Remove a field by index
fields.removeAt(2);
Assert.assertEquals(fields.getCount(), 3);
// Remove all fields from the document
fields.clear();
Assert.assertEquals(fields.getCount(), 0);
}
/// <summary>
/// Document visitor implementation that prints field info.
/// </summary>
public static class FieldVisitor extends DocumentVisitor {
public FieldVisitor() {
mBuilder = new StringBuilder();
}
/// <summary>
/// Gets the plain text of the document that was accumulated by the visitor.
/// </summary>
public String getText() {
return mBuilder.toString();
}
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(final FieldStart fieldStart) {
mBuilder.append("Found field: " + fieldStart.getFieldType() + "\r\n");
mBuilder.append("\tField code: " + fieldStart.getField().getFieldCode() + "\r\n");
mBuilder.append("\tDisplayed as: " + fieldStart.getField().getResult() + "\r\n");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(final FieldSeparator fieldSeparator) {
mBuilder.append("\tFound separator: " + fieldSeparator.getText() + "\r\n");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(final FieldEnd fieldEnd) {
mBuilder.append("End of field: " + fieldEnd.getFieldType() + "\r\n");
return VisitorAction.CONTINUE;
}
private StringBuilder mBuilder;
}
| Property Getters/Setters Summary | ||
|---|---|---|
DocumentBase | getDocument() | → inherited from Node |
| Gets the document to which this node belongs. | ||
int | getFieldType() | → inherited from FieldChar |
| Returns the type of the field. The value of the property is FieldType integer constant. | ||
Font | getFont() | → inherited from Inline |
| Provides access to the font formatting of this object. | ||
boolean | hasSeparator() | |
| Returns true if this field has a separator. | ||
boolean | isComposite() | → inherited from Node |
| Returns true if this node can contain other nodes. | ||
boolean | isDeleteRevision() | → inherited from Inline |
| Returns true if this object was deleted in Microsoft Word while change tracking was enabled. | ||
boolean | isDirty() | → inherited from FieldChar |
void | isDirty(boolean value) | |
| Gets or sets whether the current result of the field is no longer correct (stale) due to other modifications made to the document. | ||
boolean | isFormatRevision() | → inherited from Inline |
| Returns true if formatting of the object was changed in Microsoft Word while change tracking was enabled. | ||
boolean | isInsertRevision() | → inherited from Inline |
| Returns true if this object was inserted in Microsoft Word while change tracking was enabled. | ||
boolean | isLocked() | → inherited from FieldChar |
void | isLocked(boolean value) | |
| Gets or sets whether the parent field is locked (should not recalculate its result). | ||
boolean | isMoveFromRevision() | → inherited from Inline |
| Returns true if this object was moved (deleted) in Microsoft Word while change tracking was enabled. | ||
boolean | isMoveToRevision() | → inherited from Inline |
| Returns true if this object was moved (inserted) in Microsoft Word while change tracking was enabled. | ||
Node | getNextSibling() | → inherited from Node |
| Gets the node immediately following this node. | ||
int | getNodeType() | |
|
Returns |
||
CompositeNode | getParentNode() | → inherited from Node |
| Gets the immediate parent of this node. | ||
Paragraph | getParentParagraph() | → inherited from Inline |
|
Retrieves the parent |
||
Node | getPreviousSibling() | → inherited from Node |
| Gets the node immediately preceding this node. | ||
Range | getRange() | → inherited from Node |
| Returns a Range object that represents the portion of a document that is contained in this node. | ||
| Method Summary | ||
|---|---|---|
boolean | accept(DocumentVisitor visitor) | |
| Accepts a visitor. | ||
Node | deepClone(boolean isCloneChildren) | → inherited from Node |
| 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. | ||
Field | getField() | → inherited from FieldChar |
| Returns a field for the field char. | ||
java.lang.String | getText() | → inherited from SpecialChar |
| Gets the special character that this node represents. | ||
Node | nextPreOrder(Node rootNode) | → inherited from Node |
| Gets next node according to the pre-order tree traversal algorithm. | ||
Node | previousPreOrder(Node rootNode) | → inherited from Node |
| Gets the previous node according to the pre-order tree traversal algorithm. | ||
void | remove() | → inherited from Node |
| Removes itself from the parent. | ||
java.lang.String | toString(SaveOptions saveOptions) | → inherited from Node |
| Exports the content of the node into a string using the specified save options. | ||
java.lang.String | toString(int saveFormat) | → inherited from Node |
| Exports the content of the node into a string in the specified format. | ||
| Property Getters/Setters Detail |
|---|
getDocument | → inherited from Node |
public DocumentBase getDocument() | |
The node always belongs to a document even if it has just been created and not yet added to the tree, or if it has been removed from the tree.
Example:
Shows how to create a node and set its owning document.
// Open a file from disk
Document doc = new Document();
// Creating a new node of any type requires a document passed into the constructor
Paragraph para = new Paragraph(doc);
// The new paragraph node does not yet have a parent
System.out.println("Paragraph has no parent node: " + (para.getParentNode() == null));
// But the paragraph node knows its document
System.out.println("Both nodes' documents are the same: " + (para.getDocument() == doc));
// The fact that a node always belongs to a document allows us to access and modify
// properties that reference the document-wide data such as styles or lists
para.getParagraphFormat().setStyleName("Heading 1");
// Now add the paragraph to the main text of the first section
doc.getFirstSection().getBody().appendChild(para);
// The paragraph node is now a child of the Body node
System.out.println("Paragraph has a parent node: " + (para.getParentNode() != null));getFieldType | → inherited from FieldChar |
public int getFieldType() | |
Example:
Demonstrates how to retrieve the field class from an existing FieldStart node in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
FieldDate field = (FieldDate) builder.insertField(FieldType.FIELD_DATE, true);
field.getFormat().setDateTimeFormat("dddd, MMMM dd, yyyy");
field.update();
FieldChar fieldStart = field.getStart();
Assert.assertEquals(FieldType.FIELD_DATE, fieldStart.getFieldType());
Assert.assertEquals(false, fieldStart.isDirty());
Assert.assertEquals(false, fieldStart.isLocked());
// Retrieve the facade object which represents the field in the document
field = (FieldDate) fieldStart.getField();
Assert.assertEquals(false, field.isLocked());
Assert.assertEquals(" DATE \\@ \"dddd, MMMM dd, yyyy\"", field.getFieldCode());
// Update the field to show the current date
field.update();getFont | → inherited from Inline |
public Font getFont() | |
Example:
Shows how to construct an Aspose Words document node by node.
Document doc = new Document();
// A newly created blank document still comes one section, one body and one paragraph
// Calling this method will remove all those nodes to completely empty the document
doc.removeAllChildren();
// This document now has no composite nodes that content can be added to
// If we wish to edit it, we will need to repopulate its node collection,
// which we will start to do with by creating a new Section node
Section section = new Section(doc);
// Append the section to the document
doc.appendChild(section);
// Lets set some properties for the section
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain all other nodes that can be edited
Body body = new Body(doc);
section.appendChild(body);
// The body needs to have at least one paragraph
// Note that the paragraph has not yet been added to the document, but we have to specify the parent document
// The parent document is needed so the paragraph can correctly work
// with styles and other document-wide information
Paragraph para = new Paragraph(doc);
body.appendChild(para);
// We can set some formatting for the paragraph
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
// Now we can begin adding content to the document
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!" + ControlChar.SECTION_BREAK_CHAR, doc.getText());
doc.save(getArtifactsDir() + "Section.CreateFromScratch.docx");hasSeparator | |
public boolean hasSeparator() | |
Example:
Shows how to work with a document's field collection.
public void fieldCollection() throws Exception {
// Create a new document and insert some fields
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertField(" DATE \\@ \"dddd, d MMMM yyyy\" ");
builder.insertField(" TIME ");
builder.insertField(" REVNUM ");
builder.insertField(" AUTHOR \"John Doe\" ");
builder.insertField(" SUBJECT \"My Subject\" ");
builder.insertField(" QUOTE \"Hello world!\" ");
doc.updateFields();
// Get the collection that contains all the fields in a document
FieldCollection fields = doc.getRange().getFields();
Assert.assertEquals(fields.getCount(), 6);
// Iterate over the field collection and print contents and type of every field using a custom visitor implementation
FieldVisitor fieldVisitor = new FieldVisitor();
Iterator<Field> fieldEnumerator = fields.iterator();
while (fieldEnumerator.hasNext()) {
if (fieldEnumerator.next() != null) {
Field currentField = fieldEnumerator.next();
currentField.getStart().accept(fieldVisitor);
if (currentField.getSeparator() != null) {
currentField.getSeparator().accept(fieldVisitor);
}
currentField.getEnd().accept(fieldVisitor);
} else {
System.out.println("There are no fields in the document.");
}
}
System.out.println(fieldVisitor.getText());
// Get a field to remove itself
fields.get(0).remove();
Assert.assertEquals(fields.getCount(), 5);
// Remove a field by reference
Field lastField = fields.get(3);
fields.remove(lastField);
Assert.assertEquals(fields.getCount(), 4);
// Remove a field by index
fields.removeAt(2);
Assert.assertEquals(fields.getCount(), 3);
// Remove all fields from the document
fields.clear();
Assert.assertEquals(fields.getCount(), 0);
}
/// <summary>
/// Document visitor implementation that prints field info.
/// </summary>
public static class FieldVisitor extends DocumentVisitor {
public FieldVisitor() {
mBuilder = new StringBuilder();
}
/// <summary>
/// Gets the plain text of the document that was accumulated by the visitor.
/// </summary>
public String getText() {
return mBuilder.toString();
}
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(final FieldStart fieldStart) {
mBuilder.append("Found field: " + fieldStart.getFieldType() + "\r\n");
mBuilder.append("\tField code: " + fieldStart.getField().getFieldCode() + "\r\n");
mBuilder.append("\tDisplayed as: " + fieldStart.getField().getResult() + "\r\n");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(final FieldSeparator fieldSeparator) {
mBuilder.append("\tFound separator: " + fieldSeparator.getText() + "\r\n");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(final FieldEnd fieldEnd) {
mBuilder.append("End of field: " + fieldEnd.getFieldType() + "\r\n");
return VisitorAction.CONTINUE;
}
private StringBuilder mBuilder;
}isComposite | → inherited from Node |
public boolean isComposite() | |
Example:
Shows how to efficiently visit all direct and indirect children of a composite node.
public void recurseAllNodes() throws Exception {
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>
@Test(enabled = false)
public void traverseAllNodes(CompositeNode parentNode, int depth) {
// Loop through immediate children of a node
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
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(" - \"{childNode.GetText().Trim()}\"");
} else {
System.out.println();
}
}
}isDeleteRevision | → inherited from Inline |
public boolean isDeleteRevision() | |
Example:
Shows how to view revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
isDirty/isDirty | → inherited from FieldChar |
public boolean isDirty() / public void isDirty(boolean value) | |
Example:
Demonstrates how to retrieve the field class from an existing FieldStart node in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
FieldDate field = (FieldDate) builder.insertField(FieldType.FIELD_DATE, true);
field.getFormat().setDateTimeFormat("dddd, MMMM dd, yyyy");
field.update();
FieldChar fieldStart = field.getStart();
Assert.assertEquals(FieldType.FIELD_DATE, fieldStart.getFieldType());
Assert.assertEquals(false, fieldStart.isDirty());
Assert.assertEquals(false, fieldStart.isLocked());
// Retrieve the facade object which represents the field in the document
field = (FieldDate) fieldStart.getField();
Assert.assertEquals(false, field.isLocked());
Assert.assertEquals(" DATE \\@ \"dddd, MMMM dd, yyyy\"", field.getFieldCode());
// Update the field to show the current date
field.update();isFormatRevision | → inherited from Inline |
public boolean isFormatRevision() | |
Example:
Shows how to view revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
isInsertRevision | → inherited from Inline |
public boolean isInsertRevision() | |
Example:
Shows how to view revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
isLocked/isLocked | → inherited from FieldChar |
public boolean isLocked() / public void isLocked(boolean value) | |
Example:
Demonstrates how to retrieve the field class from an existing FieldStart node in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
FieldDate field = (FieldDate) builder.insertField(FieldType.FIELD_DATE, true);
field.getFormat().setDateTimeFormat("dddd, MMMM dd, yyyy");
field.update();
FieldChar fieldStart = field.getStart();
Assert.assertEquals(FieldType.FIELD_DATE, fieldStart.getFieldType());
Assert.assertEquals(false, fieldStart.isDirty());
Assert.assertEquals(false, fieldStart.isLocked());
// Retrieve the facade object which represents the field in the document
field = (FieldDate) fieldStart.getField();
Assert.assertEquals(false, field.isLocked());
Assert.assertEquals(" DATE \\@ \"dddd, MMMM dd, yyyy\"", field.getFieldCode());
// Update the field to show the current date
field.update();isMoveFromRevision | → inherited from Inline |
public boolean isMoveFromRevision() | |
Example:
Shows how to view revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
isMoveToRevision | → inherited from Inline |
public boolean isMoveToRevision() | |
Example:
Shows how to view revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
getNextSibling | → inherited from Node |
public Node getNextSibling() | |
Example:
Shows how to enumerate immediate child nodes of a composite node using NextSibling.
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Loop starting from the first child until we reach null
for (Node node = doc.getFirstSection().getBody().getFirstChild(); node != null; node = node.getNextSibling()) {
// Output the types of the nodes that we come across
System.out.println(Node.nodeTypeToString(node.getNodeType()));
}Example:
Shows how to efficiently visit all direct and indirect children of a composite node.
public void recurseAllNodes() throws Exception {
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>
@Test(enabled = false)
public void traverseAllNodes(CompositeNode parentNode, int depth) {
// Loop through immediate children of a node
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
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(" - \"{childNode.GetText().Trim()}\"");
} else {
System.out.println();
}
}
}getNodeType | |
public int getNodeType() | |
Example:
Shows how to efficiently visit all direct and indirect children of a composite node.
public void recurseAllNodes() 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>
@Test(enabled = false)
public void traverseAllNodes(CompositeNode parentNode, int depth) {
// Loop through immediate children of a node
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
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(" - \"{childNode.GetText().Trim()}\"");
} else {
System.out.println();
}
}
}getParentNode | → inherited from Node |
public CompositeNode getParentNode() | |
If a node has just been created and not yet added to the tree, or if it has been removed from the tree, the parent is null.
Example:
Shows how to access the parent node.Document doc = new Document(); // Get the document's first paragraph and append a child node to it in the form of a run with text Paragraph para = doc.getFirstSection().getBody().getFirstParagraph(); // When inserting a new node, the document that the node will belong to must be provided as an argument Run run = new Run(doc, "Hello world!"); para.appendChild(run); // The node lineage can be traced back to the document itself 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.
// Open a file from disk
Document doc = new Document();
// Creating a new node of any type requires a document passed into the constructor
Paragraph para = new Paragraph(doc);
// The new paragraph node does not yet have a parent
System.out.println("Paragraph has no parent node: " + (para.getParentNode() == null));
// But the paragraph node knows its document
System.out.println("Both nodes' documents are the same: " + (para.getDocument() == doc));
// The fact that a node always belongs to a document allows us to access and modify
// properties that reference the document-wide data such as styles or lists
para.getParagraphFormat().setStyleName("Heading 1");
// Now add the paragraph to the main text of the first section
doc.getFirstSection().getBody().appendChild(para);
// The paragraph node is now a child of the Body node
System.out.println("Paragraph has a parent node: " + (para.getParentNode() != null));getParentParagraph | → inherited from Inline |
public Paragraph getParentParagraph() | |
Example:
Shows how to view revision-related properties of Inline nodes.Document doc = new Document(getMyDir() + "Revision runs.docx"); // This document has 6 revisions Assert.assertEquals(doc.getRevisions().getCount(), 6); // The parent node of a revision is the run that the revision concerns, which is an Inline node Run run = (Run) doc.getRevisions().get(0).getParentNode(); // Get the parent paragraph Paragraph firstParagraph = run.getParentParagraph(); RunCollection runs = firstParagraph.getRuns(); Assert.assertEquals(runs.getCount(), 6); // The text in the run at index #2 was typed after revisions were tracked, so it will count as an insert revision // The font was changed, so it will also be a format revision Assert.assertTrue(runs.get(2).isInsertRevision()); Assert.assertTrue(runs.get(2).isFormatRevision()); // If one node was moved from one place to another while changes were tracked, // the node will be placed at the departure location as a "move to revision", // and a "move from revision" node will be left behind at the origin, in case we want to reject changes // Highlighting text and dragging it to another place with the mouse and cut-and-pasting (but not copy-pasting) both count as "move revisions" // The node with the "IsMoveToRevision" flag is the arrival of the move operation, and the node with the "IsMoveFromRevision" flag is the departure point Assert.assertTrue(runs.get(1).isMoveToRevision()); Assert.assertTrue(runs.get(4).isMoveFromRevision()); // If an Inline node gets deleted while changes are being tracked, it will leave behind a node with the IsDeleteRevision flag set to true until changes are accepted Assert.assertTrue(runs.get(5).isDeleteRevision());
getPreviousSibling | → inherited from Node |
public Node getPreviousSibling() | |
Example:
Shows how to use of methods of Node and CompositeNode to remove a section before the last section in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Create a second section by inserting a section break and add text to both sections
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 characters of a range.
// Insert two sections into a blank document
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.write("Section 1. ");
builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);
builder.write("Section 2.");
// Verify the whole text of the document
Assert.assertEquals("Section 1. \fSection 2.", doc.getText().trim());
// Delete the first section from the document
doc.getSections().get(0).getRange().delete();
// Check the first section was deleted by looking at the text of the whole document again
Assert.assertEquals("Section 2.", doc.getText().trim());| Method Detail |
|---|
accept | |
public boolean accept(DocumentVisitor visitor) throws java.lang.Exception | |
Calls
For more info see the Visitor design pattern.
visitor - The visitor that will visit the node.Example:
Shows how to work with a document's field collection.
public void fieldCollection() throws Exception {
// Create a new document and insert some fields
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertField(" DATE \\@ \"dddd, d MMMM yyyy\" ");
builder.insertField(" TIME ");
builder.insertField(" REVNUM ");
builder.insertField(" AUTHOR \"John Doe\" ");
builder.insertField(" SUBJECT \"My Subject\" ");
builder.insertField(" QUOTE \"Hello world!\" ");
doc.updateFields();
// Get the collection that contains all the fields in a document
FieldCollection fields = doc.getRange().getFields();
Assert.assertEquals(fields.getCount(), 6);
// Iterate over the field collection and print contents and type of every field using a custom visitor implementation
FieldVisitor fieldVisitor = new FieldVisitor();
Iterator<Field> fieldEnumerator = fields.iterator();
while (fieldEnumerator.hasNext()) {
if (fieldEnumerator.next() != null) {
Field currentField = fieldEnumerator.next();
currentField.getStart().accept(fieldVisitor);
if (currentField.getSeparator() != null) {
currentField.getSeparator().accept(fieldVisitor);
}
currentField.getEnd().accept(fieldVisitor);
} else {
System.out.println("There are no fields in the document.");
}
}
System.out.println(fieldVisitor.getText());
// Get a field to remove itself
fields.get(0).remove();
Assert.assertEquals(fields.getCount(), 5);
// Remove a field by reference
Field lastField = fields.get(3);
fields.remove(lastField);
Assert.assertEquals(fields.getCount(), 4);
// Remove a field by index
fields.removeAt(2);
Assert.assertEquals(fields.getCount(), 3);
// Remove all fields from the document
fields.clear();
Assert.assertEquals(fields.getCount(), 0);
}
/// <summary>
/// Document visitor implementation that prints field info.
/// </summary>
public static class FieldVisitor extends DocumentVisitor {
public FieldVisitor() {
mBuilder = new StringBuilder();
}
/// <summary>
/// Gets the plain text of the document that was accumulated by the visitor.
/// </summary>
public String getText() {
return mBuilder.toString();
}
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(final FieldStart fieldStart) {
mBuilder.append("Found field: " + fieldStart.getFieldType() + "\r\n");
mBuilder.append("\tField code: " + fieldStart.getField().getFieldCode() + "\r\n");
mBuilder.append("\tDisplayed as: " + fieldStart.getField().getResult() + "\r\n");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(final FieldSeparator fieldSeparator) {
mBuilder.append("\tFound separator: " + fieldSeparator.getText() + "\r\n");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(final FieldEnd fieldEnd) {
mBuilder.append("End of field: " + fieldEnd.getFieldType() + "\r\n");
return VisitorAction.CONTINUE;
}
private StringBuilder mBuilder;
}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 composite nodes with and without their child nodes.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
para.appendChild(new Run(doc, "Hello world!"));
// Clone the paragraph and the child nodes
Node cloneWithChildren = para.deepClone(true);
Assert.assertTrue(((CompositeNode) cloneWithChildren).hasChildNodes());
Assert.assertEquals("Hello world!", cloneWithChildren.getText().trim());
// Clone the paragraph without its clild nodes
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 Example:
Shows how to find out if a table contains another table or if the table itself is nested inside another table.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Nested tables.docx");
NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
for (int i = 0; i < tables.getCount(); i++) {
// First lets find if any cells in the table have tables themselves as children
int count = getChildTableCount((Table) tables.get(i));
System.out.println(MessageFormat.format("Table #{0} has {1} tables directly within its cells", i, count));
// Now let's try the other way around, lets try find if the table is nested inside another table and at what depth
int tableDepth = getNestedDepthOfTable((Table) tables.get(i));
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;
int type = table.getNodeType();
// The parent of the table will be a Cell, instead attempt to find a grandparent that is of type Table
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
// Every time we find a table a level up we increase the depth counter and then try to find an
// ancestor of type table from the parent
depth++;
parent = parent.getAncestor(Table.class);
}
return depth;
}
/**
* Determines if a table contains any immediate child table within its cells.
* Does not recursively traverse through those tables to check for further tables.
*
* @returns Returns true if at least one child cell contains a table.
* Returns false if no cells in the table contains a table.
*/
private static int getChildTableCount(final Table table) {
int tableCount = 0;
// Iterate through all child rows in the table
for (Row row : table.getRows()) {
// Iterate through all child cells in the row
for (Cell cell : row.getCells()) {
// Retrieve the collection of child tables of this cell
TableCollection childTables = cell.getTables();
// If this cell has a table as a child then return true
if (childTables.getCount() > 0) tableCount++;
}
}
// No cell contains a table
return tableCount;
}getAncestor | → inherited from Node |
public CompositeNode getAncestor(java.lang.Class ancestorType) | |
The ancestor type matches if it is equal to ancestorType or derived from ancestorType.
ancestorType - The object type of the ancestor to retrieve.Example:
Shows how to find out if a table contains another table or if the table itself is nested inside another table.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Nested tables.docx");
NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
for (int i = 0; i < tables.getCount(); i++) {
// First lets find if any cells in the table have tables themselves as children
int count = getChildTableCount((Table) tables.get(i));
System.out.println(MessageFormat.format("Table #{0} has {1} tables directly within its cells", i, count));
// Now let's try the other way around, lets try find if the table is nested inside another table and at what depth
int tableDepth = getNestedDepthOfTable((Table) tables.get(i));
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;
int type = table.getNodeType();
// The parent of the table will be a Cell, instead attempt to find a grandparent that is of type Table
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
// Every time we find a table a level up we increase the depth counter and then try to find an
// ancestor of type table from the parent
depth++;
parent = parent.getAncestor(Table.class);
}
return depth;
}
/**
* Determines if a table contains any immediate child table within its cells.
* Does not recursively traverse through those tables to check for further tables.
*
* @returns Returns true if at least one child cell contains a table.
* Returns false if no cells in the table contains a table.
*/
private static int getChildTableCount(final Table table) {
int tableCount = 0;
// Iterate through all child rows in the table
for (Row row : table.getRows()) {
// Iterate through all child cells in the row
for (Cell cell : row.getCells()) {
// Retrieve the collection of child tables of this cell
TableCollection childTables = cell.getTables();
// If this cell has a table as a child then return true
if (childTables.getCount() > 0) tableCount++;
}
}
// No cell contains a table
return tableCount;
}getField | → inherited from FieldChar |
public Field getField() | |
Example:
Demonstrates how to retrieve the field class from an existing FieldStart node in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
FieldDate field = (FieldDate) builder.insertField(FieldType.FIELD_DATE, true);
field.getFormat().setDateTimeFormat("dddd, MMMM dd, yyyy");
field.update();
FieldChar fieldStart = field.getStart();
Assert.assertEquals(FieldType.FIELD_DATE, fieldStart.getFieldType());
Assert.assertEquals(false, fieldStart.isDirty());
Assert.assertEquals(false, fieldStart.isLocked());
// Retrieve the facade object which represents the field in the document
field = (FieldDate) fieldStart.getField();
Assert.assertEquals(false, field.isLocked());
Assert.assertEquals(" DATE \\@ \"dddd, MMMM dd, yyyy\"", field.getFieldCode());
// Update the field to show the current date
field.update();getText | → inherited from SpecialChar |
public java.lang.String getText() | |
nextPreOrder | → inherited from Node |
public Node nextPreOrder(Node rootNode) | |
rootNode - The top node (limit) of traversal.Example:
Shows how to delete all images from a document using pre-order tree traversal.
Document doc = new Document(getMyDir() + "Images.docx");
Assert.assertEquals(doc.getChildNodes(NodeType.SHAPE, true).getCount(), 10);
Node curNode = doc;
while (curNode != null) {
Node nextNode = curNode.nextPreOrder(doc);
if (curNode.previousPreOrder(doc) != null && nextNode != null) {
Assert.assertEquals(curNode, nextNode.previousPreOrder(doc));
}
if (curNode.getNodeType() == NodeType.SHAPE) {
Shape shape = (Shape) curNode;
// Several shape types can have an image including image shapes and OLE objects
if (shape.hasImage()) {
shape.remove();
}
}
curNode = nextNode;
}
// The only remaining shape doesn't have an image
Assert.assertEquals(1, doc.getChildNodes(NodeType.SHAPE, true).getCount());
Assert.assertFalse(((Shape) doc.getChild(NodeType.SHAPE, 0, true)).hasImage());previousPreOrder | → inherited from Node |
public Node previousPreOrder(Node rootNode) | |
rootNode - The top node (limit) of traversal.Example:
Shows how to delete all images from a document using pre-order tree traversal.
Document doc = new Document(getMyDir() + "Images.docx");
Assert.assertEquals(doc.getChildNodes(NodeType.SHAPE, true).getCount(), 10);
Node curNode = doc;
while (curNode != null) {
Node nextNode = curNode.nextPreOrder(doc);
if (curNode.previousPreOrder(doc) != null && nextNode != null) {
Assert.assertEquals(curNode, nextNode.previousPreOrder(doc));
}
if (curNode.getNodeType() == NodeType.SHAPE) {
Shape shape = (Shape) curNode;
// Several shape types can have an image including image shapes and OLE objects
if (shape.hasImage()) {
shape.remove();
}
}
curNode = nextNode;
}
// The only remaining shape doesn't have an image
Assert.assertEquals(1, doc.getChildNodes(NodeType.SHAPE, true).getCount());
Assert.assertFalse(((Shape) doc.getChild(NodeType.SHAPE, 0, true)).hasImage());remove | → inherited from Node |
public void remove() | |
Example:
Shows how to delete all images from a document.
Document doc = new Document(getMyDir() + "Images.docx");
Assert.assertEquals(doc.getChildNodes(NodeType.SHAPE, true).getCount(), 10);
// Here we get all shapes from the document node, but you can do this for any smaller
// node too, for example delete shapes from a single section or a paragraph
NodeCollection shapes = doc.getChildNodes(NodeType.SHAPE, true);
// We cannot delete shape nodes while we enumerate through the collection
// One solution is to add nodes that we want to delete to a temporary array and delete afterwards
ArrayList shapesToDelete = new ArrayList();
for (Shape shape : (Iterable<Shape>) shapes) {
// Several shape types can have an image including image shapes and OLE objects
if (shape.hasImage()) {
shapesToDelete.add(shape);
}
}
// Now we can delete shapes
for (Shape shape : (Iterable<Shape>) shapesToDelete)
shape.remove();
// The only remaining shape doesn't have an image
Assert.assertEquals(1, doc.getChildNodes(NodeType.SHAPE, true).getCount());
Assert.assertFalse(((Shape) doc.getChild(NodeType.SHAPE, 0, true)).hasImage());Example:
Shows how to remove all 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());
// Select the first child node in the body
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();
}
// Continue going through child nodes until null (no more siblings) is reached
curNode = nextNode;
}
Assert.assertEquals(0, doc.getChildNodes(NodeType.TABLE, true).getCount());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");
// Extract the last paragraph in the document to convert to HTML
Node node = doc.getLastSection().getBody().getLastParagraph();
// When ToString is called using the html SaveFormat overload then the node is converted directly to html
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 label of each paragraph in a list as a value or a String.
Document doc = new Document(getMyDir() + "Rendering.docx");
doc.updateListLabels();
int listParaCount = 1;
for (Paragraph paragraph : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)) {
// Find if we have the paragraph list. In our document our list uses plain arabic numbers,
// which start at three and ends at six
if (paragraph.getListFormat().isListItem()) {
System.out.println(MessageFormat.format("List item paragraph #{0}", listParaCount));
// This is the text we get when actually getting when we output this node to text format
// The list labels are not included in this text output. Trim any paragraph formatting characters
String paragraphText = paragraph.toString(SaveFormat.TEXT).trim();
System.out.println("Exported Text: " + paragraphText);
ListLabel label = paragraph.getListLabel();
// This gets the position of the paragraph in current level of the list. If we have a list with multiple level then this
// will tell us what position it is on that particular level
System.out.println("\tNumerical Id: " + label.getLabelValue());
// Combine them together to include the list label with the text in the output
System.out.println("\tList label combined with text: " + label.getLabelString() + " " + paragraphText);
listParaCount++;
}
}Example:
Exports the content of a node to String in HTML format.
Document doc = new Document(getMyDir() + "Document.docx");
// Extract the last paragraph in the document to convert to HTML
Node node = doc.getLastSection().getBody().getLastParagraph();
// When ToString is called using the html SaveFormat overload then the node is converted directly to html
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));