java.lang.ObjectNode
com.aspose.words.EditableRangeEnd
public class EditableRangeEnd
A complete editable range in a Word document consists of a Use the Example:Note: Currently editable ranges are supported only at the inline-level, that is inside
public void createEditableRanges() throws Exception {
Document doc = new Document(getMyDir() + "Document.doc");
DocumentBuilder builder = new DocumentBuilder(doc);
// Start an editable range
EditableRangeStart edRange1Start = builder.startEditableRange();
// An EditableRange object is created for the EditableRangeStart that we just made
EditableRange editableRange1 = edRange1Start.getEditableRange();
// Put something inside the editable range
builder.writeln("Paragraph inside first editable range");
// An editable range is well-formed if it has a start and an end
// Multiple editable ranges can be nested and overlapping
EditableRangeEnd edRange1End = builder.endEditableRange();
// Explicitly state which EditableRangeStart a new EditableRangeEnd should be paired with
EditableRangeStart edRange2Start = builder.startEditableRange();
builder.writeln("Paragraph inside second editable range");
EditableRange editableRange2 = edRange2Start.getEditableRange();
EditableRangeEnd edRange2End = builder.endEditableRange(edRange2Start);
// Editable range starts and ends have their own respective node types
Assert.assertEquals(edRange1Start.getNodeType(), NodeType.EDITABLE_RANGE_START);
Assert.assertEquals(edRange1End.getNodeType(), NodeType.EDITABLE_RANGE_END);
// Editable range IDs are unique and set automatically
Assert.assertEquals(editableRange1.getId(), 0);
Assert.assertEquals(editableRange2.getId(), 1);
// Editable range starts and ends always belong to a range
Assert.assertEquals(editableRange1.getEditableRangeStart(), edRange1Start);
Assert.assertEquals(editableRange1.getEditableRangeEnd(), edRange1End);
// They also inherit the ID of the entire editable range that they belong to
Assert.assertEquals(editableRange1.getId(), edRange1Start.getId());
Assert.assertEquals(editableRange1.getId(), edRange1End.getId());
Assert.assertEquals(editableRange2.getId(), edRange2Start.getEditableRange().getId());
Assert.assertEquals(editableRange2.getId(), edRange2End.getEditableRangeStart().getEditableRange().getId());
// If the editable range was found in a document, it will probably have something in the single user property
// But if we make one programmatically, the property is null by default
Assert.assertEquals(editableRange1.getSingleUser(), "");
// We have to set it ourselves if we want the ranges to belong to somebody
editableRange1.setSingleUser("john.doe@myoffice.com");
editableRange2.setSingleUser("jane.doe@myoffice.com");
// Initialize a custom visitor for editable ranges that will print their contents
EditableRangeInfoPrinter editableRangeReader = new EditableRangeInfoPrinter();
// Both the start and end of an editable range can accept visitors, but not the editable range itself
edRange1Start.accept(editableRangeReader);
edRange2End.accept(editableRangeReader);
// Or, if we want to go over all the editable ranges in a document, we can get the document to accept the visitor
editableRangeReader.reset();
doc.accept(editableRangeReader);
System.out.println(editableRangeReader.toText());
}
/// <summary>
/// Visitor implementation that prints attributes and contents of ranges.
/// </summary>
public static class EditableRangeInfoPrinter extends DocumentVisitor {
public EditableRangeInfoPrinter() {
mBuilder = new StringBuilder();
}
public String toText() {
return mBuilder.toString();
}
public void reset() {
mBuilder = new StringBuilder();
mInsideEditableRange = false;
}
/// <summary>
/// Called when an EditableRangeStart node is encountered in the document.
/// </summary>
public int visitEditableRangeStart(final EditableRangeStart editableRangeStart) {
mBuilder.append(" -- Editable range found! -- " + "\r\n");
mBuilder.append("\tID: " + editableRangeStart.getId() + "\r\n");
mBuilder.append("\tUser: " + editableRangeStart.getEditableRange().getSingleUser() + "\r\n");
mBuilder.append("\tContents: " + "\r\n");
mInsideEditableRange = true;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when an EditableRangeEnd node is encountered in the document.
/// </summary>
public int visitEditableRangeEnd(final EditableRangeEnd editableRangeEnd) {
mBuilder.append(" -- End of editable range -- " + "\r\n");
mInsideEditableRange = false;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document. Only runs within editable ranges have their contents recorded.
/// </summary>
public int visitRun(final Run run) {
if (mInsideEditableRange) {
mBuilder.append("\t\"" + run.getText() + "\"" + "\r\n");
}
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
private boolean mInsideEditableRange;
private StringBuilder mBuilder;
}
| Property Getters/Setters Summary | ||
|---|---|---|
DocumentBase | getDocument() | → inherited from Node |
| Gets the document to which this node belongs. | ||
EditableRangeStart | getEditableRangeStart() | |
| Corresponding EditableRangeStart, received by ID. | ||
int | getId() | |
void | setId(int value) | |
| Specifies the identifier of the editable range. | ||
boolean | isComposite() | → inherited from Node |
| Returns true if this node can contain other nodes. | ||
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. | ||
Node | getPreviousSibling() | → inherited from Node |
| Gets the node immediately preceding this node. | ||
Range | getRange() | → inherited from Node |
| Returns a Range object that represents the portion of a document that is contained in this node. | ||
| Method Summary | ||
|---|---|---|
boolean | accept(DocumentVisitor visitor) | |
| Accepts a visitor. | ||
Node | deepClone(boolean isCloneChildren) | → inherited from Node |
CompositeNode | getAncestor(int ancestorType) | → inherited from Node |
|
Gets the first ancestor of the specified |
||
CompositeNode | getAncestor(java.lang.Class ancestorType) | → inherited from Node |
| Gets the first ancestor of the specified object type. | ||
java.lang.String | getText() | → inherited from Node |
| Gets the text of this node and of all its children. | ||
Node | nextPreOrder(Node rootNode) | → inherited from Node |
| Gets next node according to the pre-order tree traversal algorithm. | ||
Node | previousPreOrder(Node rootNode) | → inherited from Node |
| Gets the previous node according to the pre-order tree traversal algorithm. | ||
void | remove() | → inherited from Node |
| Removes itself from the parent. | ||
java.lang.String | toString(SaveOptions saveOptions) | → inherited from Node |
| Exports the content of the node into a string using the specified save options. | ||
java.lang.String | toString(int saveFormat) | → inherited from Node |
| Exports the content of the node into a string in the specified format. | ||
| Property Getters/Setters Detail |
|---|
getDocument | → inherited from Node |
public DocumentBase getDocument() | |
The node always belongs to a document even if it has just been created and not yet added to the tree, or if it has been removed from the tree.
Example:
Shows that when you create any node, it requires a document that will own the node.
// Open a file from disk.
Document doc = new Document();
// Creating a new node of any type requires a document passed into the constructor.
Paragraph para = new Paragraph(doc);
// The new paragraph node does not yet have a parent.
System.out.println("Paragraph has no parent node: " + (para.getParentNode() == null));
// But the paragraph node knows its document.
System.out.println("Both nodes' documents are the same: " + (para.getDocument() == doc));
// The fact that a node always belongs to a document allows us to access and modify
// properties that reference the document-wide data such as styles or lists.
para.getParagraphFormat().setStyleName("Heading 1");
// Now add the paragraph to the main text of the first section.
doc.getFirstSection().getBody().appendChild(para);
// The paragraph node is now a child of the Body node.
System.out.println("Paragraph has a parent node: " + (para.getParentNode() != null));getEditableRangeStart | |
public EditableRangeStart getEditableRangeStart() | |
Example:
Shows how to start and end an editable range.
public void createEditableRanges() throws Exception {
Document doc = new Document(getMyDir() + "Document.doc");
DocumentBuilder builder = new DocumentBuilder(doc);
// Start an editable range
EditableRangeStart edRange1Start = builder.startEditableRange();
// An EditableRange object is created for the EditableRangeStart that we just made
EditableRange editableRange1 = edRange1Start.getEditableRange();
// Put something inside the editable range
builder.writeln("Paragraph inside first editable range");
// An editable range is well-formed if it has a start and an end
// Multiple editable ranges can be nested and overlapping
EditableRangeEnd edRange1End = builder.endEditableRange();
// Explicitly state which EditableRangeStart a new EditableRangeEnd should be paired with
EditableRangeStart edRange2Start = builder.startEditableRange();
builder.writeln("Paragraph inside second editable range");
EditableRange editableRange2 = edRange2Start.getEditableRange();
EditableRangeEnd edRange2End = builder.endEditableRange(edRange2Start);
// Editable range starts and ends have their own respective node types
Assert.assertEquals(edRange1Start.getNodeType(), NodeType.EDITABLE_RANGE_START);
Assert.assertEquals(edRange1End.getNodeType(), NodeType.EDITABLE_RANGE_END);
// Editable range IDs are unique and set automatically
Assert.assertEquals(editableRange1.getId(), 0);
Assert.assertEquals(editableRange2.getId(), 1);
// Editable range starts and ends always belong to a range
Assert.assertEquals(editableRange1.getEditableRangeStart(), edRange1Start);
Assert.assertEquals(editableRange1.getEditableRangeEnd(), edRange1End);
// They also inherit the ID of the entire editable range that they belong to
Assert.assertEquals(editableRange1.getId(), edRange1Start.getId());
Assert.assertEquals(editableRange1.getId(), edRange1End.getId());
Assert.assertEquals(editableRange2.getId(), edRange2Start.getEditableRange().getId());
Assert.assertEquals(editableRange2.getId(), edRange2End.getEditableRangeStart().getEditableRange().getId());
// If the editable range was found in a document, it will probably have something in the single user property
// But if we make one programmatically, the property is null by default
Assert.assertEquals(editableRange1.getSingleUser(), "");
// We have to set it ourselves if we want the ranges to belong to somebody
editableRange1.setSingleUser("john.doe@myoffice.com");
editableRange2.setSingleUser("jane.doe@myoffice.com");
// Initialize a custom visitor for editable ranges that will print their contents
EditableRangeInfoPrinter editableRangeReader = new EditableRangeInfoPrinter();
// Both the start and end of an editable range can accept visitors, but not the editable range itself
edRange1Start.accept(editableRangeReader);
edRange2End.accept(editableRangeReader);
// Or, if we want to go over all the editable ranges in a document, we can get the document to accept the visitor
editableRangeReader.reset();
doc.accept(editableRangeReader);
System.out.println(editableRangeReader.toText());
}
/// <summary>
/// Visitor implementation that prints attributes and contents of ranges.
/// </summary>
public static class EditableRangeInfoPrinter extends DocumentVisitor {
public EditableRangeInfoPrinter() {
mBuilder = new StringBuilder();
}
public String toText() {
return mBuilder.toString();
}
public void reset() {
mBuilder = new StringBuilder();
mInsideEditableRange = false;
}
/// <summary>
/// Called when an EditableRangeStart node is encountered in the document.
/// </summary>
public int visitEditableRangeStart(final EditableRangeStart editableRangeStart) {
mBuilder.append(" -- Editable range found! -- " + "\r\n");
mBuilder.append("\tID: " + editableRangeStart.getId() + "\r\n");
mBuilder.append("\tUser: " + editableRangeStart.getEditableRange().getSingleUser() + "\r\n");
mBuilder.append("\tContents: " + "\r\n");
mInsideEditableRange = true;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when an EditableRangeEnd node is encountered in the document.
/// </summary>
public int visitEditableRangeEnd(final EditableRangeEnd editableRangeEnd) {
mBuilder.append(" -- End of editable range -- " + "\r\n");
mInsideEditableRange = false;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document. Only runs within editable ranges have their contents recorded.
/// </summary>
public int visitRun(final Run run) {
if (mInsideEditableRange) {
mBuilder.append("\t\"" + run.getText() + "\"" + "\r\n");
}
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
private boolean mInsideEditableRange;
private StringBuilder mBuilder;
}getId/setId | |
public int getId() / public void setId(int value) | |
Example:
Shows how to start and end an editable range.
public void createEditableRanges() throws Exception {
Document doc = new Document(getMyDir() + "Document.doc");
DocumentBuilder builder = new DocumentBuilder(doc);
// Start an editable range
EditableRangeStart edRange1Start = builder.startEditableRange();
// An EditableRange object is created for the EditableRangeStart that we just made
EditableRange editableRange1 = edRange1Start.getEditableRange();
// Put something inside the editable range
builder.writeln("Paragraph inside first editable range");
// An editable range is well-formed if it has a start and an end
// Multiple editable ranges can be nested and overlapping
EditableRangeEnd edRange1End = builder.endEditableRange();
// Explicitly state which EditableRangeStart a new EditableRangeEnd should be paired with
EditableRangeStart edRange2Start = builder.startEditableRange();
builder.writeln("Paragraph inside second editable range");
EditableRange editableRange2 = edRange2Start.getEditableRange();
EditableRangeEnd edRange2End = builder.endEditableRange(edRange2Start);
// Editable range starts and ends have their own respective node types
Assert.assertEquals(edRange1Start.getNodeType(), NodeType.EDITABLE_RANGE_START);
Assert.assertEquals(edRange1End.getNodeType(), NodeType.EDITABLE_RANGE_END);
// Editable range IDs are unique and set automatically
Assert.assertEquals(editableRange1.getId(), 0);
Assert.assertEquals(editableRange2.getId(), 1);
// Editable range starts and ends always belong to a range
Assert.assertEquals(editableRange1.getEditableRangeStart(), edRange1Start);
Assert.assertEquals(editableRange1.getEditableRangeEnd(), edRange1End);
// They also inherit the ID of the entire editable range that they belong to
Assert.assertEquals(editableRange1.getId(), edRange1Start.getId());
Assert.assertEquals(editableRange1.getId(), edRange1End.getId());
Assert.assertEquals(editableRange2.getId(), edRange2Start.getEditableRange().getId());
Assert.assertEquals(editableRange2.getId(), edRange2End.getEditableRangeStart().getEditableRange().getId());
// If the editable range was found in a document, it will probably have something in the single user property
// But if we make one programmatically, the property is null by default
Assert.assertEquals(editableRange1.getSingleUser(), "");
// We have to set it ourselves if we want the ranges to belong to somebody
editableRange1.setSingleUser("john.doe@myoffice.com");
editableRange2.setSingleUser("jane.doe@myoffice.com");
// Initialize a custom visitor for editable ranges that will print their contents
EditableRangeInfoPrinter editableRangeReader = new EditableRangeInfoPrinter();
// Both the start and end of an editable range can accept visitors, but not the editable range itself
edRange1Start.accept(editableRangeReader);
edRange2End.accept(editableRangeReader);
// Or, if we want to go over all the editable ranges in a document, we can get the document to accept the visitor
editableRangeReader.reset();
doc.accept(editableRangeReader);
System.out.println(editableRangeReader.toText());
}
/// <summary>
/// Visitor implementation that prints attributes and contents of ranges.
/// </summary>
public static class EditableRangeInfoPrinter extends DocumentVisitor {
public EditableRangeInfoPrinter() {
mBuilder = new StringBuilder();
}
public String toText() {
return mBuilder.toString();
}
public void reset() {
mBuilder = new StringBuilder();
mInsideEditableRange = false;
}
/// <summary>
/// Called when an EditableRangeStart node is encountered in the document.
/// </summary>
public int visitEditableRangeStart(final EditableRangeStart editableRangeStart) {
mBuilder.append(" -- Editable range found! -- " + "\r\n");
mBuilder.append("\tID: " + editableRangeStart.getId() + "\r\n");
mBuilder.append("\tUser: " + editableRangeStart.getEditableRange().getSingleUser() + "\r\n");
mBuilder.append("\tContents: " + "\r\n");
mInsideEditableRange = true;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when an EditableRangeEnd node is encountered in the document.
/// </summary>
public int visitEditableRangeEnd(final EditableRangeEnd editableRangeEnd) {
mBuilder.append(" -- End of editable range -- " + "\r\n");
mInsideEditableRange = false;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document. Only runs within editable ranges have their contents recorded.
/// </summary>
public int visitRun(final Run run) {
if (mInsideEditableRange) {
mBuilder.append("\t\"" + run.getText() + "\"" + "\r\n");
}
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
private boolean mInsideEditableRange;
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 {
// Open a document.
Document doc = new Document(getMyDir() + "Node.RecurseAllNodes.doc");
// Invoke the recursive function that will walk the tree.
traverseAllNodes(doc);
}
/**
* A simple function that will walk through all children of a specified node recursively
* and print the type of each node to the screen.
*/
@Test(enabled = false)
public void traverseAllNodes(final CompositeNode parentNode) {
// This is the most efficient way to loop through immediate children of a node.
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
// Do some useful work.
System.out.println(Node.nodeTypeToString(childNode.getNodeType()));
// Recurse into the node if it is a composite node.
if (childNode.isComposite()) {
traverseAllNodes((CompositeNode) childNode);
}
}
}getNextSibling | → inherited from Node |
public Node getNextSibling() | |
Example:
Shows how to enumerate immediate child nodes of a composite node using NextSibling. In this example we enumerate all paragraphs of a section body.
// Get the section that we want to work on.
Section section = doc.getSections().get(0);
Body body = section.getBody();
// Loop starting from the first child until we reach null.
for (Node node = body.getFirstChild(); node != null; node = node.getNextSibling()) {
// Output the types of the nodes that we come across.
System.out.println(Node.nodeTypeToString(node.getNodeType()));
}Example:
Shows how to efficiently visit all direct and indirect children of a composite node.
public void recurseAllNodes() throws Exception {
// Open a document.
Document doc = new Document(getMyDir() + "Node.RecurseAllNodes.doc");
// Invoke the recursive function that will walk the tree.
traverseAllNodes(doc);
}
/**
* A simple function that will walk through all children of a specified node recursively
* and print the type of each node to the screen.
*/
@Test(enabled = false)
public void traverseAllNodes(final CompositeNode parentNode) {
// This is the most efficient way to loop through immediate children of a node.
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
// Do some useful work.
System.out.println(Node.nodeTypeToString(childNode.getNodeType()));
// Recurse into the node if it is a composite node.
if (childNode.isComposite()) {
traverseAllNodes((CompositeNode) childNode);
}
}
}getNodeType | |
public int getNodeType() | |
Example:
Shows how to start and end an editable range.
public void createEditableRanges() throws Exception {
Document doc = new Document(getMyDir() + "Document.doc");
DocumentBuilder builder = new DocumentBuilder(doc);
// Start an editable range
EditableRangeStart edRange1Start = builder.startEditableRange();
// An EditableRange object is created for the EditableRangeStart that we just made
EditableRange editableRange1 = edRange1Start.getEditableRange();
// Put something inside the editable range
builder.writeln("Paragraph inside first editable range");
// An editable range is well-formed if it has a start and an end
// Multiple editable ranges can be nested and overlapping
EditableRangeEnd edRange1End = builder.endEditableRange();
// Explicitly state which EditableRangeStart a new EditableRangeEnd should be paired with
EditableRangeStart edRange2Start = builder.startEditableRange();
builder.writeln("Paragraph inside second editable range");
EditableRange editableRange2 = edRange2Start.getEditableRange();
EditableRangeEnd edRange2End = builder.endEditableRange(edRange2Start);
// Editable range starts and ends have their own respective node types
Assert.assertEquals(edRange1Start.getNodeType(), NodeType.EDITABLE_RANGE_START);
Assert.assertEquals(edRange1End.getNodeType(), NodeType.EDITABLE_RANGE_END);
// Editable range IDs are unique and set automatically
Assert.assertEquals(editableRange1.getId(), 0);
Assert.assertEquals(editableRange2.getId(), 1);
// Editable range starts and ends always belong to a range
Assert.assertEquals(editableRange1.getEditableRangeStart(), edRange1Start);
Assert.assertEquals(editableRange1.getEditableRangeEnd(), edRange1End);
// They also inherit the ID of the entire editable range that they belong to
Assert.assertEquals(editableRange1.getId(), edRange1Start.getId());
Assert.assertEquals(editableRange1.getId(), edRange1End.getId());
Assert.assertEquals(editableRange2.getId(), edRange2Start.getEditableRange().getId());
Assert.assertEquals(editableRange2.getId(), edRange2End.getEditableRangeStart().getEditableRange().getId());
// If the editable range was found in a document, it will probably have something in the single user property
// But if we make one programmatically, the property is null by default
Assert.assertEquals(editableRange1.getSingleUser(), "");
// We have to set it ourselves if we want the ranges to belong to somebody
editableRange1.setSingleUser("john.doe@myoffice.com");
editableRange2.setSingleUser("jane.doe@myoffice.com");
// Initialize a custom visitor for editable ranges that will print their contents
EditableRangeInfoPrinter editableRangeReader = new EditableRangeInfoPrinter();
// Both the start and end of an editable range can accept visitors, but not the editable range itself
edRange1Start.accept(editableRangeReader);
edRange2End.accept(editableRangeReader);
// Or, if we want to go over all the editable ranges in a document, we can get the document to accept the visitor
editableRangeReader.reset();
doc.accept(editableRangeReader);
System.out.println(editableRangeReader.toText());
}
/// <summary>
/// Visitor implementation that prints attributes and contents of ranges.
/// </summary>
public static class EditableRangeInfoPrinter extends DocumentVisitor {
public EditableRangeInfoPrinter() {
mBuilder = new StringBuilder();
}
public String toText() {
return mBuilder.toString();
}
public void reset() {
mBuilder = new StringBuilder();
mInsideEditableRange = false;
}
/// <summary>
/// Called when an EditableRangeStart node is encountered in the document.
/// </summary>
public int visitEditableRangeStart(final EditableRangeStart editableRangeStart) {
mBuilder.append(" -- Editable range found! -- " + "\r\n");
mBuilder.append("\tID: " + editableRangeStart.getId() + "\r\n");
mBuilder.append("\tUser: " + editableRangeStart.getEditableRange().getSingleUser() + "\r\n");
mBuilder.append("\tContents: " + "\r\n");
mInsideEditableRange = true;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when an EditableRangeEnd node is encountered in the document.
/// </summary>
public int visitEditableRangeEnd(final EditableRangeEnd editableRangeEnd) {
mBuilder.append(" -- End of editable range -- " + "\r\n");
mInsideEditableRange = false;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document. Only runs within editable ranges have their contents recorded.
/// </summary>
public int visitRun(final Run run) {
if (mInsideEditableRange) {
mBuilder.append("\t\"" + run.getText() + "\"" + "\r\n");
}
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
private boolean mInsideEditableRange;
private StringBuilder mBuilder;
}getParentNode | → inherited from Node |
public CompositeNode getParentNode() | |
If a node has just been created and not yet added to the tree, or if it has been removed from the tree, the parent is null.
Example:
Shows how to access the parent node.
// Create a new empty document. It has one section.
Document doc = new Document();
// The section is the first child node of the document.
Node section = doc.getFirstChild();
// The section's parent node is the document.
System.out.println("Section parent is the document: " + (doc == section.getParentNode()));Example:
Shows that when you create any node, it requires a document that will own the node.
// Open a file from disk.
Document doc = new Document();
// Creating a new node of any type requires a document passed into the constructor.
Paragraph para = new Paragraph(doc);
// The new paragraph node does not yet have a parent.
System.out.println("Paragraph has no parent node: " + (para.getParentNode() == null));
// But the paragraph node knows its document.
System.out.println("Both nodes' documents are the same: " + (para.getDocument() == doc));
// The fact that a node always belongs to a document allows us to access and modify
// properties that reference the document-wide data such as styles or lists.
para.getParagraphFormat().setStyleName("Heading 1");
// Now add the paragraph to the main text of the first section.
doc.getFirstSection().getBody().appendChild(para);
// The paragraph node is now a child of the Body node.
System.out.println("Paragraph has a parent node: " + (para.getParentNode() != null));getPreviousSibling | → inherited from Node |
public Node getPreviousSibling() | |
Example:
Demonstrates use of methods of Node and CompositeNode to remove a section before the last section in the document.
// Document is a CompositeNode and LastChild returns the last child node in the Document node.
// Since the Document can contain only Section nodes, the last child is the last section.
Node lastSection = doc.getLastChild();
// Each node knows its next and previous sibling nodes.
// Previous sibling of a section is a section before the specified section.
// If the node is the first child, PreviousSibling will return null.
Node sectionBeforeLast = lastSection.getPreviousSibling();
if (sectionBeforeLast != null) {
doc.removeChild(sectionBeforeLast);
}getRange | → inherited from Node |
public Range getRange() | |
Example:
Shows how to delete all characters of a range.// Open Word document. Document doc = new Document(getMyDir() + "Range.DeleteSection.doc"); // The document contains two sections. Each section has a paragraph of text. System.out.println(doc.getText()); // 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. System.out.println(doc.getText());
| 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 start and end an editable range.
public void createEditableRanges() throws Exception {
Document doc = new Document(getMyDir() + "Document.doc");
DocumentBuilder builder = new DocumentBuilder(doc);
// Start an editable range
EditableRangeStart edRange1Start = builder.startEditableRange();
// An EditableRange object is created for the EditableRangeStart that we just made
EditableRange editableRange1 = edRange1Start.getEditableRange();
// Put something inside the editable range
builder.writeln("Paragraph inside first editable range");
// An editable range is well-formed if it has a start and an end
// Multiple editable ranges can be nested and overlapping
EditableRangeEnd edRange1End = builder.endEditableRange();
// Explicitly state which EditableRangeStart a new EditableRangeEnd should be paired with
EditableRangeStart edRange2Start = builder.startEditableRange();
builder.writeln("Paragraph inside second editable range");
EditableRange editableRange2 = edRange2Start.getEditableRange();
EditableRangeEnd edRange2End = builder.endEditableRange(edRange2Start);
// Editable range starts and ends have their own respective node types
Assert.assertEquals(edRange1Start.getNodeType(), NodeType.EDITABLE_RANGE_START);
Assert.assertEquals(edRange1End.getNodeType(), NodeType.EDITABLE_RANGE_END);
// Editable range IDs are unique and set automatically
Assert.assertEquals(editableRange1.getId(), 0);
Assert.assertEquals(editableRange2.getId(), 1);
// Editable range starts and ends always belong to a range
Assert.assertEquals(editableRange1.getEditableRangeStart(), edRange1Start);
Assert.assertEquals(editableRange1.getEditableRangeEnd(), edRange1End);
// They also inherit the ID of the entire editable range that they belong to
Assert.assertEquals(editableRange1.getId(), edRange1Start.getId());
Assert.assertEquals(editableRange1.getId(), edRange1End.getId());
Assert.assertEquals(editableRange2.getId(), edRange2Start.getEditableRange().getId());
Assert.assertEquals(editableRange2.getId(), edRange2End.getEditableRangeStart().getEditableRange().getId());
// If the editable range was found in a document, it will probably have something in the single user property
// But if we make one programmatically, the property is null by default
Assert.assertEquals(editableRange1.getSingleUser(), "");
// We have to set it ourselves if we want the ranges to belong to somebody
editableRange1.setSingleUser("john.doe@myoffice.com");
editableRange2.setSingleUser("jane.doe@myoffice.com");
// Initialize a custom visitor for editable ranges that will print their contents
EditableRangeInfoPrinter editableRangeReader = new EditableRangeInfoPrinter();
// Both the start and end of an editable range can accept visitors, but not the editable range itself
edRange1Start.accept(editableRangeReader);
edRange2End.accept(editableRangeReader);
// Or, if we want to go over all the editable ranges in a document, we can get the document to accept the visitor
editableRangeReader.reset();
doc.accept(editableRangeReader);
System.out.println(editableRangeReader.toText());
}
/// <summary>
/// Visitor implementation that prints attributes and contents of ranges.
/// </summary>
public static class EditableRangeInfoPrinter extends DocumentVisitor {
public EditableRangeInfoPrinter() {
mBuilder = new StringBuilder();
}
public String toText() {
return mBuilder.toString();
}
public void reset() {
mBuilder = new StringBuilder();
mInsideEditableRange = false;
}
/// <summary>
/// Called when an EditableRangeStart node is encountered in the document.
/// </summary>
public int visitEditableRangeStart(final EditableRangeStart editableRangeStart) {
mBuilder.append(" -- Editable range found! -- " + "\r\n");
mBuilder.append("\tID: " + editableRangeStart.getId() + "\r\n");
mBuilder.append("\tUser: " + editableRangeStart.getEditableRange().getSingleUser() + "\r\n");
mBuilder.append("\tContents: " + "\r\n");
mInsideEditableRange = true;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when an EditableRangeEnd node is encountered in the document.
/// </summary>
public int visitEditableRangeEnd(final EditableRangeEnd editableRangeEnd) {
mBuilder.append(" -- End of editable range -- " + "\r\n");
mInsideEditableRange = false;
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document. Only runs within editable ranges have their contents recorded.
/// </summary>
public int visitRun(final Run run) {
if (mInsideEditableRange) {
mBuilder.append("\t\"" + run.getText() + "\"" + "\r\n");
}
// Let the visitor continue visiting other nodes
return VisitorAction.CONTINUE;
}
private boolean mInsideEditableRange;
private StringBuilder mBuilder;
}deepClone | → inherited from Node |
public Node deepClone(boolean isCloneChildren) | |
Example:
Shows how to clone composite nodes with and without their child nodes.// Create a new empty document. Document doc = new Document(); // Add some text to the first paragraph Paragraph para = doc.getFirstSection().getBody().getFirstParagraph(); para.appendChild(new Run(doc, "Some text")); // Clone the paragraph and the child nodes. Node cloneWithChildren = para.deepClone(true); // Only clone the paragraph and no child nodes. Node cloneWithoutChildren = para.deepClone(false);
getAncestor | → inherited from Node |
public CompositeNode getAncestor(int ancestorType) | |
ancestorType - A Example:
Shows how to find out if a table contains another table or if the table itself is nested inside another table.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Table.NestedTables.doc");
int tableIndex = 0;
for (Table table : (Iterable<Table>) doc.getChildNodes(NodeType.TABLE, true)) {
// First lets find if any cells in the table have tables themselves as children.
int count = getChildTableCount(table);
System.out.println(MessageFormat.format("Table #{0} has {1} tables directly within its cells", tableIndex, count));
// Now let's try the other way around, lets try find if the table is nested inside another table and at what depth.
int tableDepth = getNestedDepthOfTable(table);
if (tableDepth > 0) {
System.out.println(MessageFormat.format("Table #{0} is nested inside another table at depth of {1}", tableIndex, tableDepth));
} else {
System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", tableIndex));
}
tableIndex++;
}
}
/**
* Calculates what level a table is nested inside other tables.
*
* @returns An integer containing the level the table is nested at.
* 0 = Table is not nested inside any other table
* 1 = Table is nested within one parent table
* 2 = Table is nested within two parent tables etc..
*/
private static int getNestedDepthOfTable(final Table table) {
int depth = 0;
int type = table.getNodeType();
// The parent of the table will be a Cell, instead attempt to find a grandparent that is of type Table
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
// Every time we find a table a level up we increase the depth counter and then try to find an
// ancestor of type table from the parent.
depth++;
parent = parent.getAncestor(Table.class);
}
return depth;
}
/**
* Determines if a table contains any immediate child table within its cells.
* Does not recursively traverse through those tables to check for further tables.
*
* @returns Returns true if at least one child cell contains a table.
* Returns false if no cells in the table contains a table.
*/
private static int getChildTableCount(final Table table) {
int tableCount = 0;
// Iterate through all child rows in the table
for (Row row : table.getRows()) {
// Iterate through all child cells in the row
for (Cell cell : row.getCells()) {
// Retrieve the collection of child tables of this cell
TableCollection childTables = cell.getTables();
// If this cell has a table as a child then return true
if (childTables.getCount() > 0) tableCount++;
}
}
// No cell contains a table
return tableCount;
}getAncestor | → inherited from Node |
public CompositeNode getAncestor(java.lang.Class ancestorType) | |
The ancestor type matches if it is equal to ancestorType or derived from ancestorType.
ancestorType - The object type of the ancestor to retrieve.Example:
Shows how to find out if a table contains another table or if the table itself is nested inside another table.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Table.NestedTables.doc");
int tableIndex = 0;
for (Table table : (Iterable<Table>) doc.getChildNodes(NodeType.TABLE, true)) {
// First lets find if any cells in the table have tables themselves as children.
int count = getChildTableCount(table);
System.out.println(MessageFormat.format("Table #{0} has {1} tables directly within its cells", tableIndex, count));
// Now let's try the other way around, lets try find if the table is nested inside another table and at what depth.
int tableDepth = getNestedDepthOfTable(table);
if (tableDepth > 0) {
System.out.println(MessageFormat.format("Table #{0} is nested inside another table at depth of {1}", tableIndex, tableDepth));
} else {
System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", tableIndex));
}
tableIndex++;
}
}
/**
* Calculates what level a table is nested inside other tables.
*
* @returns An integer containing the level the table is nested at.
* 0 = Table is not nested inside any other table
* 1 = Table is nested within one parent table
* 2 = Table is nested within two parent tables etc..
*/
private static int getNestedDepthOfTable(final Table table) {
int depth = 0;
int type = table.getNodeType();
// The parent of the table will be a Cell, instead attempt to find a grandparent that is of type Table
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
// Every time we find a table a level up we increase the depth counter and then try to find an
// ancestor of type table from the parent.
depth++;
parent = parent.getAncestor(Table.class);
}
return depth;
}
/**
* Determines if a table contains any immediate child table within its cells.
* Does not recursively traverse through those tables to check for further tables.
*
* @returns Returns true if at least one child cell contains a table.
* Returns false if no cells in the table contains a table.
*/
private static int getChildTableCount(final Table table) {
int tableCount = 0;
// Iterate through all child rows in the table
for (Row row : table.getRows()) {
// Iterate through all child cells in the row
for (Cell cell : row.getCells()) {
// Retrieve the collection of child tables of this cell
TableCollection childTables = cell.getTables();
// If this cell has a table as a child then return true
if (childTables.getCount() > 0) tableCount++;
}
}
// No cell contains a table
return tableCount;
}getText | → inherited from Node |
public java.lang.String getText() | |
The returned string includes all control and special characters as described in
Example:
Creates a simple document from scratch using the Aspose.Words object model.
// Create an "empty" document. Note that like in Microsoft Word,
// the empty document has one section, body and one paragraph in it.
Document doc = new Document();
// This truly makes the document empty. No sections (not possible in Microsoft Word).
doc.removeAllChildren();
// Create a new section node.
// Note that the section has not yet been added to the document,
// but we have to specify the parent document.
Section section = new Section(doc);
// Append the section to the document.
doc.appendChild(section);
// Lets set some properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// The section that we created is empty, lets populate it. The section needs at least the Body node.
Body body = new Body(doc);
section.appendChild(body);
// The body needs to have at least one paragraph.
// Note that the paragraph has not yet been added to the document,
// but we have to specify the parent document.
// The parent document is needed so the paragraph can correctly work
// with styles and other document-wide information.
Paragraph para = new Paragraph(doc);
body.appendChild(para);
// We can set some formatting for the paragraph
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
// So far we have one empty paragraph in the document.
// The document is valid and can be saved, but lets add some text before saving.
// Create a new run of text and add it to our paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
// As a matter of interest, you can retrieve text of the whole document and
// see that \x000c is automatically appended. \x000c is the end of section character.
System.out.println(doc.getText());
// Save the document.
doc.save(getArtifactsDir() + "Section.CreateFromScratch.doc");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.
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;
}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.
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;
}remove | → inherited from Node |
public void remove() | |
Example:
Shows how to remove all nodes of a specific type from a composite node. In this example we remove tables from a section body.
// Get the section that we want to work on.
Section section = doc.getSections().get(0);
Body body = section.getBody();
// Select the first child node in the body.
Node curNode = body.getFirstChild();
while (curNode != null) {
// Save the pointer to the next sibling node because if the current
// node is removed from the parent in the next step, we will have
// no way of finding the next node to continue the loop.
Node nextNode = curNode.getNextSibling();
// A section body can contain Paragraph and Table nodes.
// If the node is a Table, remove it from the parent.
if (curNode.getNodeType() == NodeType.TABLE) {
curNode.remove();
}
// Continue going through child nodes until null (no more siblings) is reached.
curNode = nextNode;
}Example:
Shows how to delete all images from a document.
// 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();
}toString | → inherited from Node |
public java.lang.String toString(SaveOptions saveOptions) throws java.lang.Exception | |
saveOptions - Specifies the options that control how the node is saved.Example:
Exports the content of a node to string in HTML format using custom specified options.Document doc = new Document(getMyDir() + "Document.doc"); // Extract the last paragraph in the document to convert to HTML. Node node = doc.getLastSection().getBody().getLastParagraph(); // Create an instance of HtmlSaveOptions and set a few options. HtmlSaveOptions saveOptions = new HtmlSaveOptions(); saveOptions.setExportHeadersFootersMode(ExportHeadersFootersMode.PER_SECTION); saveOptions.setExportRelativeFontSize(true); // Convert the document to HTML and return as a string. Pass the instance of HtmlSaveOptions to // to use the specified options during the conversion. String nodeAsHtml = node.toString(saveOptions);
toString | → inherited from Node |
public java.lang.String toString(int saveFormat)
throws java.lang.Exception | |
saveFormat - A SaveFormat value.Example:
Shows how to extract the label of each paragraph in a list as a value or a String.
Document doc = new Document(getMyDir() + "Lists.PrintOutAllLists.doc");
doc.updateListLabels();
int listParaCount = 1;
for (Paragraph paragraph : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)) {
// Find if we have the paragraph list. In our document our list uses plain arabic numbers,
// which start at three and ends at six.
if (paragraph.getListFormat().isListItem()) {
System.out.println(MessageFormat.format("Paragraph #{0}", listParaCount));
// This is the text we get when actually getting when we output this node to text format.
// The list labels are not included in this text output. Trim any paragraph formatting characters.
String paragraphText = paragraph.toString(SaveFormat.TEXT).trim();
System.out.println("Exported Text: " + paragraphText);
ListLabel label = paragraph.getListLabel();
// This gets the position of the paragraph in current level of the list. If we have a list with multiple level then this
// will tell us what position it is on that particular level.
System.out.println("Numerical Id: " + label.getLabelValue());
// Combine them together to include the list label with the text in the output.
System.out.println("List label combined with text: " + label.getLabelString() + " " + paragraphText);
listParaCount++;
}
}Example:
Shows the difference between calling the GetText and ToString methods on a node.
Document doc = new Document();
// Enter a dummy field into the document.
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertField("MERGEFIELD Field");
// GetText will retrieve all field codes and special characters
System.out.println("GetText() Result: " + doc.getText());
// ToString will export the node to the specified format. When converted to text it will not retrieve fields code
// or special characters, but will still contain some natural formatting characters such as paragraph markers etc.
// This is the same as "viewing" the document as if it was opened in a text editor.
System.out.println("ToString() Result: " + doc.toString(SaveFormat.TEXT));Example:
Exports the content of a node to string in HTML format using default options.Document doc = new Document(getMyDir() + "Document.doc"); // Extract the last paragraph in the document to convert to HTML. Node node = doc.getLastSection().getBody().getLastParagraph(); // When ToString is called using the SaveFormat overload then conversion is executed using default save options. // When saving to HTML using default options the following settings are set: // ExportImagesAsBase64 = true // CssStyleSheetType = CssStyleSheetType.Inline // ExportFontResources = false String nodeAsHtml = node.toString(SaveFormat.HTML);