public class Paragraph extends CompositeNode
To learn more, visit the Working with Paragraphs documentation article.
Remarks:
Paragraph is a block-level node and can be a child of classes derived from Story or InlineStory.
Paragraph can contain any number of inline-level nodes and bookmarks.
The complete list of child nodes that can occur inside a paragraph consists of BookmarkStart, BookmarkEnd, FieldStart, FieldSeparator, FieldEnd, FormField, Comment, Footnote, Run, SpecialChar, Shape, GroupShape, SmartTag.
A valid paragraph in Microsoft Word always ends with a paragraph break character and a minimal valid paragraph consists just of a paragraph break. The Paragraph class automatically appends the appropriate paragraph break character at the end and this character is not part of the child nodes of the Paragraph, therefore a Paragraph can be empty.
Do not include the end of paragraph ControlChar.PARAGRAPH_BREAK or end of cell ControlChar.CELL characters inside the text of the paragraph as it might make the paragraph invalid when the document is opened in Microsoft Word.
Examples:
Shows how to construct an Aspose.Words document by hand.
Document doc = new Document();
// A blank document contains one section, one body and one paragraph.
// Call the "RemoveAllChildren" method to remove all those nodes,
// and end up with a document node with no children.
doc.removeAllChildren();
// This document now has no composite child nodes that we can add content to.
// If we wish to edit it, we will need to repopulate its node collection.
// First, create a new section, and then append it as a child to the root document node.
Section section = new Section(doc);
doc.appendChild(section);
// Set some page setup properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain and display all its contents
// on the page between the section's header and footer.
Body body = new Body(doc);
section.appendChild(body);
// Create a paragraph, set some formatting properties, and then append it as a child to the body.
Paragraph para = new Paragraph(doc);
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
body.appendChild(para);
// Finally, add some content to do the document. Create a run,
// set its appearance and contents, and then append it as a child to the paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!", doc.getText().trim());
doc.save(getArtifactsDir() + "Section.CreateManually.docx");
| Constructor and Description |
|---|
Paragraph(DocumentBase doc)
Initializes a new instance of the
Paragraph class. |
| Modifier and Type | Method and Description |
|---|---|
boolean |
accept(DocumentVisitor visitor)
Accepts a visitor.
|
int |
acceptEnd(DocumentVisitor visitor)
Accepts a visitor for visiting the end of the document's paragraph.
|
int |
acceptStart(DocumentVisitor visitor)
Accepts a visitor for visiting the start of the document's paragraph.
|
Field |
appendField(int fieldType,
boolean updateField) |
Field |
appendField(java.lang.String fieldCode)
Appends a field to this paragraph.
|
Field |
appendField(java.lang.String fieldCode,
java.lang.String fieldValue)
Appends a field to this paragraph.
|
void |
clearParaAttrs() |
void |
clearRunAttrs() |
java.lang.Object |
fetchInheritedParaAttr(int key) |
java.lang.Object |
fetchInheritedRunAttr(int key) |
java.lang.Object |
fetchParaAttr(int key) |
boolean |
getBreakIsStyleSeparator()
True if this paragraph break is a Style Separator.
|
java.lang.Object |
getDirectParaAttr(int key) |
java.lang.Object |
getDirectParaAttr(int key,
int revisionsView) |
java.lang.Object |
getDirectRunAttr(int key) |
java.lang.Object |
getDirectRunAttr(int key,
int revisionsView) |
TabStop[] |
getEffectiveTabStops()
Returns array of all tab stops applied to this paragraph, including applied indirectly by styles or lists.
|
FrameFormat |
getFrameFormat()
Provides access to the frame formatting properties.
|
ListFormat |
getListFormat()
Provides access to the list formatting properties of the paragraph.
|
ListLabel |
getListLabel()
Gets a
getListLabel() object that provides access to list numbering value and formatting for this paragraph. |
int |
getNodeType()
Returns
NodeType.PARAGRAPH. |
Font |
getParagraphBreakFont()
Provides access to the font formatting of the paragraph break character.
|
ParagraphFormat |
getParagraphFormat()
Provides access to the paragraph formatting properties.
|
Section |
getParentSection()
Retrieves the parent
Section of the paragraph. |
Story |
getParentStory()
Retrieves the parent section-level story that can be
Body or HeaderFooter. |
RunCollection |
getRuns()
Provides access to the typed collection of pieces of text inside the paragraph.
|
java.lang.String |
getText()
Gets the text of this paragraph including the end of paragraph character.
|
Field |
insertField(int fieldType,
boolean updateField,
Node refNode,
boolean isAfter) |
Field |
insertField(java.lang.String fieldCode,
Node refNode,
boolean isAfter)
Inserts a field into this paragraph.
|
Field |
insertField(java.lang.String fieldCode,
java.lang.String fieldValue,
Node refNode,
boolean isAfter)
Inserts a field into this paragraph.
|
boolean |
isDeleteRevision()
Returns true if this object was deleted in Microsoft Word while change tracking was enabled.
|
boolean |
isEndOfCell()
True if this paragraph is the last paragraph in a
Cell; false otherwise. |
boolean |
isEndOfDocument()
True if this paragraph is the last paragraph in the last section of the document.
|
boolean |
isEndOfHeaderFooter()
True if this paragraph is the last paragraph in the
HeaderFooter (main text story) of a Section; false otherwise. |
boolean |
isEndOfSection()
|
boolean |
isFormatRevision()
Returns true if formatting of the object was changed in Microsoft Word while change tracking was enabled.
|
boolean |
isInCell()
True if this paragraph is an immediate child of
Cell; false otherwise. |
boolean |
isInsertRevision()
Returns true if this object was inserted in Microsoft Word while change tracking was enabled.
|
boolean |
isListItem()
True when the paragraph is an item in a bulleted or numbered list in original revision.
|
boolean |
isMoveFromRevision()
Returns
true if this object was moved (deleted) in Microsoft Word while change tracking was enabled. |
boolean |
isMoveToRevision()
Returns
true if this object was moved (inserted) in Microsoft Word while change tracking was enabled. |
int |
joinRunsWithSameFormatting()
Joins runs with the same formatting in the paragraph.
|
void |
removeMoveRevisions() |
void |
removeParaAttr(int key) |
void |
removeRunAttr(int key) |
void |
setParaAttr(int key,
java.lang.Object value) |
void |
setRunAttr(int key,
java.lang.Object value) |
acceptChildren, acceptCore, appendChild, coreRemoveSelfOnly, getChild, getChildNodes, getContainer, getCount, getCurrentNode, getFirstChild, getLastChild, getNextMatchingNode, hasChildNodes, indexOf, insertAfter, insertBefore, isComposite, iterator, prependChild, removeAllChildren, removeChild, removeSmartTags, selectNodes, selectSingleNodedeepClone, getAncestor, getAncestor, getCustomNodeId, getDocument, getNextSibling, getParentNode, getPreviousSibling, getRange, memberwiseClone, nextPreOrder, nodeTypeToString, previousPreOrder, remove, setCustomNodeId, toString, toString, toString, visitorActionToBoolpublic Paragraph(DocumentBase doc)
Paragraph class.
Remarks:
When Paragraph is created, it belongs to the specified document, but is not yet part of the document and Node.getParentNode() is null.
To append Paragraph to the document use CompositeNode.insertAfter(com.aspose.words.Node, com.aspose.words.Node) or CompositeNode.insertBefore(com.aspose.words.Node, com.aspose.words.Node) on the story where you want the paragraph inserted.
Examples:
Shows how to construct an Aspose.Words document by hand.
Document doc = new Document();
// A blank document contains one section, one body and one paragraph.
// Call the "RemoveAllChildren" method to remove all those nodes,
// and end up with a document node with no children.
doc.removeAllChildren();
// This document now has no composite child nodes that we can add content to.
// If we wish to edit it, we will need to repopulate its node collection.
// First, create a new section, and then append it as a child to the root document node.
Section section = new Section(doc);
doc.appendChild(section);
// Set some page setup properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain and display all its contents
// on the page between the section's header and footer.
Body body = new Body(doc);
section.appendChild(body);
// Create a paragraph, set some formatting properties, and then append it as a child to the body.
Paragraph para = new Paragraph(doc);
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
body.appendChild(para);
// Finally, add some content to do the document. Create a run,
// set its appearance and contents, and then append it as a child to the paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!", doc.getText().trim());
doc.save(getArtifactsDir() + "Section.CreateManually.docx");
doc - The owner document.public int getNodeType()
NodeType.PARAGRAPH.
Examples:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}
getNodeType in class NodeNodeType.PARAGRAPH. The returned value is one of NodeType constants.public Story getParentStory()
Body or HeaderFooter.
Examples:
Shows how to create a header and a footer.
Document doc = new Document();
// Create a header and append a paragraph to it. The text in that paragraph
// will appear at the top of every page of this section, above the main body text.
HeaderFooter header = new HeaderFooter(doc, HeaderFooterType.HEADER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(header);
Paragraph para = header.appendParagraph("My header.");
Assert.assertTrue(header.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
// Create a footer and append a paragraph to it. The text in that paragraph
// will appear at the bottom of every page of this section, below the main body text.
HeaderFooter footer = new HeaderFooter(doc, HeaderFooterType.FOOTER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(footer);
para = footer.appendParagraph("My footer.");
Assert.assertFalse(footer.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
Assert.assertEquals(para.getParentStory(), footer);
Assert.assertEquals(para.getParentSection(), footer.getParentSection());
Assert.assertEquals(header.getParentSection(), footer.getParentSection());
doc.save(getArtifactsDir() + "HeaderFooter.Create.docx");
Story value.public Section getParentSection()
Section of the paragraph.
Examples:
Shows how to create a header and a footer.
Document doc = new Document();
// Create a header and append a paragraph to it. The text in that paragraph
// will appear at the top of every page of this section, above the main body text.
HeaderFooter header = new HeaderFooter(doc, HeaderFooterType.HEADER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(header);
Paragraph para = header.appendParagraph("My header.");
Assert.assertTrue(header.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
// Create a footer and append a paragraph to it. The text in that paragraph
// will appear at the bottom of every page of this section, below the main body text.
HeaderFooter footer = new HeaderFooter(doc, HeaderFooterType.FOOTER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(footer);
para = footer.appendParagraph("My footer.");
Assert.assertFalse(footer.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
Assert.assertEquals(para.getParentStory(), footer);
Assert.assertEquals(para.getParentSection(), footer.getParentSection());
Assert.assertEquals(header.getParentSection(), footer.getParentSection());
doc.save(getArtifactsDir() + "HeaderFooter.Create.docx");
Section value.public boolean isInCell()
Cell; false otherwise.
Examples:
Shows how to set a table to stay together on the same page.
Document doc = new Document(getMyDir() + "Table spanning two pages.docx");
Table table = doc.getFirstSection().getBody().getTables().get(0);
// Enabling KeepWithNext for every paragraph in the table except for the
// last ones in the last row will prevent the table from splitting across multiple pages.
for (Cell cell : (Iterable<Cell>) table.getChildNodes(NodeType.CELL, true))
for (Paragraph para : cell.getParagraphs()) {
Assert.assertTrue(para.isInCell());
if (!(cell.getParentRow().isLastRow() && para.isEndOfCell()))
para.getParagraphFormat().setKeepWithNext(true);
}
doc.save(getArtifactsDir() + "Table.KeepTableTogether.docx");
boolean value.public boolean isEndOfCell()
Cell; false otherwise.
Examples:
Shows how to set a table to stay together on the same page.
Document doc = new Document(getMyDir() + "Table spanning two pages.docx");
Table table = doc.getFirstSection().getBody().getTables().get(0);
// Enabling KeepWithNext for every paragraph in the table except for the
// last ones in the last row will prevent the table from splitting across multiple pages.
for (Cell cell : (Iterable<Cell>) table.getChildNodes(NodeType.CELL, true))
for (Paragraph para : cell.getParagraphs()) {
Assert.assertTrue(para.isInCell());
if (!(cell.getParentRow().isLastRow() && para.isEndOfCell()))
para.getParagraphFormat().setKeepWithNext(true);
}
doc.save(getArtifactsDir() + "Table.KeepTableTogether.docx");
boolean value.public boolean getBreakIsStyleSeparator()
Examples:
Shows how to write text to the same line as a TOC heading and have it not show up in the TOC.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertTableOfContents("\\o \\h \\z \\u");
builder.insertBreak(BreakType.PAGE_BREAK);
// Insert a paragraph with a style that the TOC will pick up as an entry.
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
// Both these strings are in the same paragraph and will therefore show up on the same TOC entry.
builder.write("Heading 1. ");
builder.write("Will appear in the TOC. ");
// If we insert a style separator, we can write more text in the same paragraph
// and use a different style without showing up in the TOC.
// If we use a heading type style after the separator, we can draw multiple TOC entries from one document text line.
builder.insertStyleSeparator();
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.QUOTE);
builder.write("Won't appear in the TOC. ");
Assert.assertTrue(doc.getFirstSection().getBody().getParagraphs().get(0).getBreakIsStyleSeparator());
doc.updateFields();
doc.save(getArtifactsDir() + "Paragraph.BreakIsStyleSeparator.docx");
boolean value.public boolean isEndOfSection()
Body (main text story) of a Section; false otherwise.
Examples:
Shows how to insert the contents of one document to a bookmark in another document.
public void insertAtBookmark() throws Exception {
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.startBookmark("InsertionPoint");
builder.write("We will insert a document here: ");
builder.endBookmark("InsertionPoint");
Document docToInsert = new Document();
builder = new DocumentBuilder(docToInsert);
builder.write("Hello world!");
docToInsert.save(getArtifactsDir() + "NodeImporter.InsertAtMergeField.docx");
Bookmark bookmark = doc.getRange().getBookmarks().get("InsertionPoint");
insertDocument(bookmark.getBookmarkStart().getParentNode(), docToInsert);
Assert.assertEquals("We will insert a document here: " +
"\rHello world!", doc.getText().trim());
}
/// <summary>
/// Inserts the contents of a document after the specified node.
/// </summary>
static void insertDocument(Node insertionDestination, Document docToInsert) {
if (((insertionDestination.getNodeType()) == (NodeType.PARAGRAPH)) || ((insertionDestination.getNodeType()) == (NodeType.TABLE))) {
CompositeNode destinationParent = insertionDestination.getParentNode();
NodeImporter importer =
new NodeImporter(docToInsert, insertionDestination.getDocument(), ImportFormatMode.KEEP_SOURCE_FORMATTING);
// Loop through all block-level nodes in the section's body,
// then clone and insert every node that is not the last empty paragraph of a section.
for (Section srcSection : docToInsert.getSections())
for (Node srcNode : srcSection.getBody()) {
if (((srcNode.getNodeType()) == (NodeType.PARAGRAPH))) {
Paragraph para = (Paragraph) srcNode;
if (para.isEndOfSection() && !para.hasChildNodes())
continue;
}
Node newNode = importer.importNode(srcNode, true);
destinationParent.insertAfter(newNode, insertionDestination);
insertionDestination = newNode;
}
} else {
throw new IllegalArgumentException("The destination node should be either a paragraph or table.");
}
}
boolean value.public boolean isEndOfHeaderFooter()
HeaderFooter (main text story) of a Section; false otherwise.
Examples:
Shows how to create a header and a footer.
Document doc = new Document();
// Create a header and append a paragraph to it. The text in that paragraph
// will appear at the top of every page of this section, above the main body text.
HeaderFooter header = new HeaderFooter(doc, HeaderFooterType.HEADER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(header);
Paragraph para = header.appendParagraph("My header.");
Assert.assertTrue(header.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
// Create a footer and append a paragraph to it. The text in that paragraph
// will appear at the bottom of every page of this section, below the main body text.
HeaderFooter footer = new HeaderFooter(doc, HeaderFooterType.FOOTER_PRIMARY);
doc.getFirstSection().getHeadersFooters().add(footer);
para = footer.appendParagraph("My footer.");
Assert.assertFalse(footer.isHeader());
Assert.assertTrue(para.isEndOfHeaderFooter());
Assert.assertEquals(para.getParentStory(), footer);
Assert.assertEquals(para.getParentSection(), footer.getParentSection());
Assert.assertEquals(header.getParentSection(), footer.getParentSection());
doc.save(getArtifactsDir() + "HeaderFooter.Create.docx");
boolean value.public boolean isEndOfDocument()
Examples:
Shows how to insert a paragraph into the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Font font = builder.getFont();
font.setSize(16.0);
font.setBold(true);
font.setColor(Color.BLUE);
font.setName("Arial");
font.setUnderline(Underline.DASH);
ParagraphFormat paragraphFormat = builder.getParagraphFormat();
paragraphFormat.setFirstLineIndent(8.0);
paragraphFormat.setAlignment(ParagraphAlignment.JUSTIFY);
paragraphFormat.setAddSpaceBetweenFarEastAndAlpha(true);
paragraphFormat.setAddSpaceBetweenFarEastAndDigit(true);
paragraphFormat.setKeepTogether(true);
// The "Writeln" method ends the paragraph after appending text
// and then starts a new line, adding a new paragraph.
builder.writeln("Hello world!");
Assert.assertTrue(builder.getCurrentParagraph().isEndOfDocument());
boolean value.public ParagraphFormat getParagraphFormat()
Examples:
Shows how to construct an Aspose.Words document by hand.
Document doc = new Document();
// A blank document contains one section, one body and one paragraph.
// Call the "RemoveAllChildren" method to remove all those nodes,
// and end up with a document node with no children.
doc.removeAllChildren();
// This document now has no composite child nodes that we can add content to.
// If we wish to edit it, we will need to repopulate its node collection.
// First, create a new section, and then append it as a child to the root document node.
Section section = new Section(doc);
doc.appendChild(section);
// Set some page setup properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain and display all its contents
// on the page between the section's header and footer.
Body body = new Body(doc);
section.appendChild(body);
// Create a paragraph, set some formatting properties, and then append it as a child to the body.
Paragraph para = new Paragraph(doc);
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
body.appendChild(para);
// Finally, add some content to do the document. Create a run,
// set its appearance and contents, and then append it as a child to the paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!", doc.getText().trim());
doc.save(getArtifactsDir() + "Section.CreateManually.docx");
ParagraphFormat value.public ListFormat getListFormat()
Examples:
Shows how to output all paragraphs in a document that are list items.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.getListFormat().applyNumberDefault();
builder.writeln("Numbered list item 1");
builder.writeln("Numbered list item 2");
builder.writeln("Numbered list item 3");
builder.getListFormat().removeNumbers();
builder.getListFormat().applyBulletDefault();
builder.writeln("Bulleted list item 1");
builder.writeln("Bulleted list item 2");
builder.writeln("Bulleted list item 3");
builder.getListFormat().removeNumbers();
NodeCollection paras = doc.getChildNodes(NodeType.PARAGRAPH, true);
for (Paragraph para : (Iterable<Paragraph>) paras) {
if (para.getListFormat().isListItem()) {
System.out.println(java.text.MessageFormat.format("*** A paragraph belongs to list {0}", para.getListFormat().getList().getListId()));
System.out.println(para.getText());
}
}
ListFormat value.public FrameFormat getFrameFormat()
Examples:
Shows how to get information about formatting properties of paragraphs that are frames.
Document doc = new Document(getMyDir() + "Paragraph frame.docx");
Paragraph paragraphFrame = IterableUtils.find(doc.getFirstSection().getBody().getParagraphs(), p -> p.getFrameFormat().isFrame());
Assert.assertEquals(233.3d, paragraphFrame.getFrameFormat().getWidth());
Assert.assertEquals(138.8d, paragraphFrame.getFrameFormat().getHeight());
Assert.assertEquals(HeightRule.AT_LEAST, paragraphFrame.getFrameFormat().getHeightRule());
Assert.assertEquals(HorizontalAlignment.DEFAULT, paragraphFrame.getFrameFormat().getHorizontalAlignment());
Assert.assertEquals(VerticalAlignment.DEFAULT, paragraphFrame.getFrameFormat().getVerticalAlignment());
Assert.assertEquals(34.05d, paragraphFrame.getFrameFormat().getHorizontalPosition());
Assert.assertEquals(RelativeHorizontalPosition.PAGE, paragraphFrame.getFrameFormat().getRelativeHorizontalPosition());
Assert.assertEquals(9.0d, paragraphFrame.getFrameFormat().getHorizontalDistanceFromText());
Assert.assertEquals(20.5d, paragraphFrame.getFrameFormat().getVerticalPosition());
Assert.assertEquals(RelativeVerticalPosition.PARAGRAPH, paragraphFrame.getFrameFormat().getRelativeVerticalPosition());
Assert.assertEquals(0.0d, paragraphFrame.getFrameFormat().getVerticalDistanceFromText());
FrameFormat value.public ListLabel getListLabel()
getListLabel() object that provides access to list numbering value and formatting for this paragraph.
Examples:
Shows how to extract the list labels of all paragraphs that are list items.
Document doc = new Document(getMyDir() + "Rendering.docx"); doc.updateListLabels(); int listParaCount = 1; for (Paragraph paragraph : (Iterable) doc.getChildNodes(NodeType.PARAGRAPH, true)) { // Find if we have the paragraph list. In our document, our list uses plain Arabic numbers, // which start at three and ends at six. if (paragraph.getListFormat().isListItem()) { System.out.println(MessageFormat.format("List item paragraph #{0}", listParaCount)); // This is the text we get when getting when we output this node to text format. // This text output will omit list labels. Trim any paragraph formatting characters. String paragraphText = paragraph.toString(SaveFormat.TEXT).trim(); System.out.println("Exported Text: " + paragraphText); ListLabel label = paragraph.getListLabel(); // This gets the position of the paragraph in the current level of the list. If we have a list with multiple levels, // this will tell us what position it is on that level. System.out.println("\tNumerical Id: {label.LabelValue}"); // Combine them together to include the list label with the text in the output. System.out.println("\tList label combined with text: {label.LabelString} {paragraphText}"); } }
getListLabel() object that provides access to list numbering value and formatting for this paragraph.public RunCollection getRuns()
Examples:
Shows how to determine the revision type of an inline node.
Document doc = new Document(getMyDir() + "Revision runs.docx");
// When we edit the document while the "Track Changes" option, found in via Review -> Tracking,
// is turned on in Microsoft Word, the changes we apply count as revisions.
// When editing a document using Aspose.Words, we can begin tracking revisions by
// invoking the document's "StartTrackRevisions" method and stop tracking by using the "StopTrackRevisions" method.
// We can either accept revisions to assimilate them into the document
// or reject them to change the proposed change effectively.
Assert.assertEquals(6, doc.getRevisions().getCount());
// The parent node of a revision is the run that the revision concerns. A Run is an Inline node.
Run run = (Run) doc.getRevisions().get(0).getParentNode();
Paragraph firstParagraph = run.getParentParagraph();
RunCollection runs = firstParagraph.getRuns();
Assert.assertEquals(runs.getCount(), 6);
// Below are five types of revisions that can flag an Inline node.
// 1 - An "insert" revision:
// This revision occurs when we insert text while tracking changes.
Assert.assertTrue(runs.get(2).isInsertRevision());
// 2 - A "format" revision:
// This revision occurs when we change the formatting of text while tracking changes.
Assert.assertTrue(runs.get(2).isFormatRevision());
// 3 - A "move from" revision:
// When we highlight text in Microsoft Word, and then drag it to a different place in the document
// while tracking changes, two revisions appear.
// The "move from" revision is a copy of the text originally before we moved it.
Assert.assertTrue(runs.get(4).isMoveFromRevision());
// 4 - A "move to" revision:
// The "move to" revision is the text that we moved in its new position in the document.
// "Move from" and "move to" revisions appear in pairs for every move revision we carry out.
// Accepting a move revision deletes the "move from" revision and its text,
// and keeps the text from the "move to" revision.
// Rejecting a move revision conversely keeps the "move from" revision and deletes the "move to" revision.
Assert.assertTrue(runs.get(1).isMoveToRevision());
// 5 - A "delete" revision:
// This revision occurs when we delete text while tracking changes. When we delete text like this,
// it will stay in the document as a revision until we either accept the revision,
// which will delete the text for good, or reject the revision, which will keep the text we deleted where it was.
Assert.assertTrue(runs.get(5).isDeleteRevision());
RunCollection value.public Font getParagraphBreakFont()
Examples:
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
public void removeHiddenContentFromDocument() throws Exception {
Document doc = new Document(getMyDir() + "Hidden content.docx");
RemoveHiddenContentVisitor hiddenContentRemover = new RemoveHiddenContentVisitor();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 4, true);
para.accept(hiddenContentRemover);
// 2 - Table node:
Table table = doc.getFirstSection().getBody().getTables().get(0);
table.accept(hiddenContentRemover);
// 3 - Document node:
doc.accept(hiddenContentRemover);
doc.save(getArtifactsDir() + "Font.RemoveHiddenContentFromDocument.docx");
}
/// <summary>
/// Removes all visited nodes marked as "hidden content".
/// </summary>
public static class RemoveHiddenContentVisitor extends DocumentVisitor {
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
if (fieldStart.getFont().getHidden())
fieldStart.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
if (fieldEnd.getFont().getHidden())
fieldEnd.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
if (fieldSeparator.getFont().getHidden())
fieldSeparator.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
if (run.getFont().getHidden())
run.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph node is encountered in the document.
/// </summary>
public int visitParagraphStart(Paragraph paragraph) {
if (paragraph.getParagraphBreakFont().getHidden())
paragraph.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField is encountered in the document.
/// </summary>
public int visitFormField(FormField formField) {
if (formField.getFont().getHidden())
formField.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a GroupShape is encountered in the document.
/// </summary>
public int visitGroupShapeStart(GroupShape groupShape) {
if (groupShape.getFont().getHidden())
groupShape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Shape is encountered in the document.
/// </summary>
public int visitShapeStart(Shape shape) {
if (shape.getFont().getHidden())
shape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Comment is encountered in the document.
/// </summary>
public int visitCommentStart(Comment comment) {
if (comment.getFont().getHidden())
comment.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote is encountered in the document.
/// </summary>
public int visitFootnoteStart(Footnote footnote) {
if (footnote.getFont().getHidden())
footnote.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialCharacter is encountered in the document.
/// </summary>
public int visitSpecialChar(SpecialChar specialChar) {
if (specialChar.getFont().getHidden())
specialChar.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Table node is ended in the document.
/// </summary>
public int visitTableEnd(Table table) {
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table.hasChildNodes())
table.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Cell node is ended in the document.
/// </summary>
public int visitCellEnd(Cell cell) {
if (!cell.hasChildNodes() && cell.getParentNode() != null)
cell.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Row node is ended in the document.
/// </summary>
public int visitRowEnd(Row row) {
if (!row.hasChildNodes() && row.getParentNode() != null)
row.remove();
return VisitorAction.CONTINUE;
}
}
Font value.public boolean isInsertRevision()
Examples:
Shows how to work with revision paragraphs.
Document doc = new Document();
Body body = doc.getFirstSection().getBody();
Paragraph para = body.getFirstParagraph();
para.appendChild(new Run(doc, "Paragraph 1. "));
body.appendParagraph("Paragraph 2. ");
body.appendParagraph("Paragraph 3. ");
// The above paragraphs are not revisions.
// Paragraphs that we add after starting revision tracking will register as "Insert" revisions.
doc.startTrackRevisions("John Doe", new Date());
para = body.appendParagraph("Paragraph 4. ");
Assert.assertTrue(para.isInsertRevision());
// Paragraphs that we remove after starting revision tracking will register as "Delete" revisions.
ParagraphCollection paragraphs = body.getParagraphs();
Assert.assertEquals(4, paragraphs.getCount());
para = paragraphs.get(2);
para.remove();
// Such paragraphs will remain until we either accept or reject the delete revision.
// Accepting the revision will remove the paragraph for good,
// and rejecting the revision will leave it in the document as if we never deleted it.
Assert.assertEquals(4, paragraphs.getCount());
Assert.assertTrue(para.isDeleteRevision());
// Accept the revision, and then verify that the paragraph is gone.
doc.acceptAllRevisions();
Assert.assertEquals(paragraphs.getCount(), 3);
Assert.assertEquals(para.getCount(), 0);
Assert.assertEquals(
"Paragraph 1. \r" +
"Paragraph 2. \r" +
"Paragraph 4.", doc.getText().trim());
public boolean isDeleteRevision()
Examples:
Shows how to work with revision paragraphs.
Document doc = new Document();
Body body = doc.getFirstSection().getBody();
Paragraph para = body.getFirstParagraph();
para.appendChild(new Run(doc, "Paragraph 1. "));
body.appendParagraph("Paragraph 2. ");
body.appendParagraph("Paragraph 3. ");
// The above paragraphs are not revisions.
// Paragraphs that we add after starting revision tracking will register as "Insert" revisions.
doc.startTrackRevisions("John Doe", new Date());
para = body.appendParagraph("Paragraph 4. ");
Assert.assertTrue(para.isInsertRevision());
// Paragraphs that we remove after starting revision tracking will register as "Delete" revisions.
ParagraphCollection paragraphs = body.getParagraphs();
Assert.assertEquals(4, paragraphs.getCount());
para = paragraphs.get(2);
para.remove();
// Such paragraphs will remain until we either accept or reject the delete revision.
// Accepting the revision will remove the paragraph for good,
// and rejecting the revision will leave it in the document as if we never deleted it.
Assert.assertEquals(4, paragraphs.getCount());
Assert.assertTrue(para.isDeleteRevision());
// Accept the revision, and then verify that the paragraph is gone.
doc.acceptAllRevisions();
Assert.assertEquals(paragraphs.getCount(), 3);
Assert.assertEquals(para.getCount(), 0);
Assert.assertEquals(
"Paragraph 1. \r" +
"Paragraph 2. \r" +
"Paragraph 4.", doc.getText().trim());
public boolean isMoveFromRevision()
true if this object was moved (deleted) in Microsoft Word while change tracking was enabled.
Examples:
Shows how to check whether a paragraph is a move revision.
Document doc = new Document(getMyDir() + "Revisions.docx");
// This document contains "Move" revisions, which appear when we highlight text with the cursor,
// and then drag it to move it to another location
// while tracking revisions in Microsoft Word via "Review" -> "Track changes".
Assert.assertEquals(6, IterableUtils.countMatches(doc.getRevisions(), r -> r.getRevisionType() == RevisionType.MOVING));
ParagraphCollection paragraphs = doc.getFirstSection().getBody().getParagraphs();
// Move revisions consist of pairs of "Move from", and "Move to" revisions.
// These revisions are potential changes to the document that we can either accept or reject.
// Before we accept/reject a move revision, the document
// must keep track of both the departure and arrival destinations of the text.
// The second and the fourth paragraph define one such revision, and thus both have the same contents.
Assert.assertEquals(paragraphs.get(1).getText(), paragraphs.get(3).getText());
// The "Move from" revision is the paragraph where we dragged the text from.
// If we accept the revision, this paragraph will disappear,
// and the other will remain and no longer be a revision.
Assert.assertTrue(paragraphs.get(1).isMoveFromRevision());
// The "Move to" revision is the paragraph where we dragged the text to.
// If we reject the revision, this paragraph instead will disappear, and the other will remain.
Assert.assertTrue(paragraphs.get(3).isMoveToRevision());
true if this object was moved (deleted) in Microsoft Word while change tracking was enabled.public boolean isMoveToRevision()
true if this object was moved (inserted) in Microsoft Word while change tracking was enabled.
Examples:
Shows how to check whether a paragraph is a move revision.
Document doc = new Document(getMyDir() + "Revisions.docx");
// This document contains "Move" revisions, which appear when we highlight text with the cursor,
// and then drag it to move it to another location
// while tracking revisions in Microsoft Word via "Review" -> "Track changes".
Assert.assertEquals(6, IterableUtils.countMatches(doc.getRevisions(), r -> r.getRevisionType() == RevisionType.MOVING));
ParagraphCollection paragraphs = doc.getFirstSection().getBody().getParagraphs();
// Move revisions consist of pairs of "Move from", and "Move to" revisions.
// These revisions are potential changes to the document that we can either accept or reject.
// Before we accept/reject a move revision, the document
// must keep track of both the departure and arrival destinations of the text.
// The second and the fourth paragraph define one such revision, and thus both have the same contents.
Assert.assertEquals(paragraphs.get(1).getText(), paragraphs.get(3).getText());
// The "Move from" revision is the paragraph where we dragged the text from.
// If we accept the revision, this paragraph will disappear,
// and the other will remain and no longer be a revision.
Assert.assertTrue(paragraphs.get(1).isMoveFromRevision());
// The "Move to" revision is the paragraph where we dragged the text to.
// If we reject the revision, this paragraph instead will disappear, and the other will remain.
Assert.assertTrue(paragraphs.get(3).isMoveToRevision());
true if this object was moved (inserted) in Microsoft Word while change tracking was enabled.public boolean isFormatRevision()
Examples:
Shows how to check whether a paragraph is a format revision.
Document doc = new Document(getMyDir() + "Format revision.docx");
// This paragraph is a "Format" revision, which occurs when we change the formatting of existing text
// while tracking revisions in Microsoft Word via "Review" -> "Track changes".
Assert.assertTrue(doc.getFirstSection().getBody().getFirstParagraph().isFormatRevision());
public boolean accept(DocumentVisitor visitor) throws java.lang.Exception
Remarks:
Enumerates over this node and all of its children. Each node calls a corresponding method on DocumentVisitor.
For more info see the Visitor design pattern.
Calls DocumentVisitor.visitParagraphStart(com.aspose.words.Paragraph), then calls Node.accept(com.aspose.words.DocumentVisitor) for all child nodes of the paragraph and calls DocumentVisitor.visitParagraphEnd(com.aspose.words.Paragraph) at the end.
Examples:
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
public void removeHiddenContentFromDocument() throws Exception {
Document doc = new Document(getMyDir() + "Hidden content.docx");
RemoveHiddenContentVisitor hiddenContentRemover = new RemoveHiddenContentVisitor();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 4, true);
para.accept(hiddenContentRemover);
// 2 - Table node:
Table table = doc.getFirstSection().getBody().getTables().get(0);
table.accept(hiddenContentRemover);
// 3 - Document node:
doc.accept(hiddenContentRemover);
doc.save(getArtifactsDir() + "Font.RemoveHiddenContentFromDocument.docx");
}
/// <summary>
/// Removes all visited nodes marked as "hidden content".
/// </summary>
public static class RemoveHiddenContentVisitor extends DocumentVisitor {
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
if (fieldStart.getFont().getHidden())
fieldStart.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
if (fieldEnd.getFont().getHidden())
fieldEnd.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
if (fieldSeparator.getFont().getHidden())
fieldSeparator.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
if (run.getFont().getHidden())
run.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph node is encountered in the document.
/// </summary>
public int visitParagraphStart(Paragraph paragraph) {
if (paragraph.getParagraphBreakFont().getHidden())
paragraph.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField is encountered in the document.
/// </summary>
public int visitFormField(FormField formField) {
if (formField.getFont().getHidden())
formField.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a GroupShape is encountered in the document.
/// </summary>
public int visitGroupShapeStart(GroupShape groupShape) {
if (groupShape.getFont().getHidden())
groupShape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Shape is encountered in the document.
/// </summary>
public int visitShapeStart(Shape shape) {
if (shape.getFont().getHidden())
shape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Comment is encountered in the document.
/// </summary>
public int visitCommentStart(Comment comment) {
if (comment.getFont().getHidden())
comment.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote is encountered in the document.
/// </summary>
public int visitFootnoteStart(Footnote footnote) {
if (footnote.getFont().getHidden())
footnote.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialCharacter is encountered in the document.
/// </summary>
public int visitSpecialChar(SpecialChar specialChar) {
if (specialChar.getFont().getHidden())
specialChar.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Table node is ended in the document.
/// </summary>
public int visitTableEnd(Table table) {
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table.hasChildNodes())
table.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Cell node is ended in the document.
/// </summary>
public int visitCellEnd(Cell cell) {
if (!cell.hasChildNodes() && cell.getParentNode() != null)
cell.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Row node is ended in the document.
/// </summary>
public int visitRowEnd(Row row) {
if (!row.hasChildNodes() && row.getParentNode() != null)
row.remove();
return VisitorAction.CONTINUE;
}
}
accept in class Nodevisitor - The visitor that will visit the nodes.DocumentVisitor stopped the operation before visiting all nodes.java.lang.Exceptionpublic int acceptStart(DocumentVisitor visitor) throws java.lang.Exception
Examples:
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
public void removeHiddenContentFromDocument() throws Exception {
Document doc = new Document(getMyDir() + "Hidden content.docx");
RemoveHiddenContentVisitor hiddenContentRemover = new RemoveHiddenContentVisitor();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 4, true);
para.accept(hiddenContentRemover);
// 2 - Table node:
Table table = doc.getFirstSection().getBody().getTables().get(0);
table.accept(hiddenContentRemover);
// 3 - Document node:
doc.accept(hiddenContentRemover);
doc.save(getArtifactsDir() + "Font.RemoveHiddenContentFromDocument.docx");
}
/// <summary>
/// Removes all visited nodes marked as "hidden content".
/// </summary>
public static class RemoveHiddenContentVisitor extends DocumentVisitor {
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
if (fieldStart.getFont().getHidden())
fieldStart.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
if (fieldEnd.getFont().getHidden())
fieldEnd.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
if (fieldSeparator.getFont().getHidden())
fieldSeparator.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
if (run.getFont().getHidden())
run.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph node is encountered in the document.
/// </summary>
public int visitParagraphStart(Paragraph paragraph) {
if (paragraph.getParagraphBreakFont().getHidden())
paragraph.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField is encountered in the document.
/// </summary>
public int visitFormField(FormField formField) {
if (formField.getFont().getHidden())
formField.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a GroupShape is encountered in the document.
/// </summary>
public int visitGroupShapeStart(GroupShape groupShape) {
if (groupShape.getFont().getHidden())
groupShape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Shape is encountered in the document.
/// </summary>
public int visitShapeStart(Shape shape) {
if (shape.getFont().getHidden())
shape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Comment is encountered in the document.
/// </summary>
public int visitCommentStart(Comment comment) {
if (comment.getFont().getHidden())
comment.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote is encountered in the document.
/// </summary>
public int visitFootnoteStart(Footnote footnote) {
if (footnote.getFont().getHidden())
footnote.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialCharacter is encountered in the document.
/// </summary>
public int visitSpecialChar(SpecialChar specialChar) {
if (specialChar.getFont().getHidden())
specialChar.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Table node is ended in the document.
/// </summary>
public int visitTableEnd(Table table) {
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table.hasChildNodes())
table.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Cell node is ended in the document.
/// </summary>
public int visitCellEnd(Cell cell) {
if (!cell.hasChildNodes() && cell.getParentNode() != null)
cell.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Row node is ended in the document.
/// </summary>
public int visitRowEnd(Row row) {
if (!row.hasChildNodes() && row.getParentNode() != null)
row.remove();
return VisitorAction.CONTINUE;
}
}
acceptStart in class CompositeNodevisitor - The document visitor.VisitorAction constants.java.lang.Exceptionpublic int acceptEnd(DocumentVisitor visitor) throws java.lang.Exception
Examples:
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
public void removeHiddenContentFromDocument() throws Exception {
Document doc = new Document(getMyDir() + "Hidden content.docx");
RemoveHiddenContentVisitor hiddenContentRemover = new RemoveHiddenContentVisitor();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 4, true);
para.accept(hiddenContentRemover);
// 2 - Table node:
Table table = doc.getFirstSection().getBody().getTables().get(0);
table.accept(hiddenContentRemover);
// 3 - Document node:
doc.accept(hiddenContentRemover);
doc.save(getArtifactsDir() + "Font.RemoveHiddenContentFromDocument.docx");
}
/// <summary>
/// Removes all visited nodes marked as "hidden content".
/// </summary>
public static class RemoveHiddenContentVisitor extends DocumentVisitor {
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
public int visitFieldStart(FieldStart fieldStart) {
if (fieldStart.getFont().getHidden())
fieldStart.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
public int visitFieldEnd(FieldEnd fieldEnd) {
if (fieldEnd.getFont().getHidden())
fieldEnd.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
public int visitFieldSeparator(FieldSeparator fieldSeparator) {
if (fieldSeparator.getFont().getHidden())
fieldSeparator.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
public int visitRun(Run run) {
if (run.getFont().getHidden())
run.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph node is encountered in the document.
/// </summary>
public int visitParagraphStart(Paragraph paragraph) {
if (paragraph.getParagraphBreakFont().getHidden())
paragraph.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField is encountered in the document.
/// </summary>
public int visitFormField(FormField formField) {
if (formField.getFont().getHidden())
formField.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a GroupShape is encountered in the document.
/// </summary>
public int visitGroupShapeStart(GroupShape groupShape) {
if (groupShape.getFont().getHidden())
groupShape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Shape is encountered in the document.
/// </summary>
public int visitShapeStart(Shape shape) {
if (shape.getFont().getHidden())
shape.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Comment is encountered in the document.
/// </summary>
public int visitCommentStart(Comment comment) {
if (comment.getFont().getHidden())
comment.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote is encountered in the document.
/// </summary>
public int visitFootnoteStart(Footnote footnote) {
if (footnote.getFont().getHidden())
footnote.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialCharacter is encountered in the document.
/// </summary>
public int visitSpecialChar(SpecialChar specialChar) {
if (specialChar.getFont().getHidden())
specialChar.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Table node is ended in the document.
/// </summary>
public int visitTableEnd(Table table) {
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table.hasChildNodes())
table.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Cell node is ended in the document.
/// </summary>
public int visitCellEnd(Cell cell) {
if (!cell.hasChildNodes() && cell.getParentNode() != null)
cell.remove();
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when visiting of a Row node is ended in the document.
/// </summary>
public int visitRowEnd(Row row) {
if (!row.hasChildNodes() && row.getParentNode() != null)
row.remove();
return VisitorAction.CONTINUE;
}
}
acceptEnd in class CompositeNodevisitor - The document visitor.VisitorAction constants.java.lang.Exceptionpublic java.lang.String getText()
Remarks:
The text of all child nodes is concatenated and the end of paragraph character is appended as follows:
Body, then ControlChar.SECTION_BREAK (\x000c) is appended.
Cell, then ControlChar.CELL (\x0007) is appended.
ControlChar.PARAGRAPH_BREAK (\r) is appended.
The returned string includes all control and special characters as described in ControlChar.
Examples:
Shows how to add, update and delete child nodes in a CompositeNode's collection of children.
Document doc = new Document();
// An empty document, by default, has one paragraph.
Assert.assertEquals(1, doc.getFirstSection().getBody().getParagraphs().getCount());
// Composite nodes such as our paragraph can contain other composite and inline nodes as children.
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
Run paragraphText = new Run(doc, "Initial text. ");
paragraph.appendChild(paragraphText);
// Create three more run nodes.
Run run1 = new Run(doc, "Run 1. ");
Run run2 = new Run(doc, "Run 2. ");
Run run3 = new Run(doc, "Run 3. ");
// The document body will not display these runs until we insert them into a composite node
// that itself is a part of the document's node tree, as we did with the first run.
// We can determine where the text contents of nodes that we insert
// appears in the document by specifying an insertion location relative to another node in the paragraph.
Assert.assertEquals("Initial text.", paragraph.getText().trim());
// Insert the second run into the paragraph in front of the initial run.
paragraph.insertBefore(run2, paragraphText);
Assert.assertEquals("Run 2. Initial text.", paragraph.getText().trim());
// Insert the third run after the initial run.
paragraph.insertAfter(run3, paragraphText);
Assert.assertEquals("Run 2. Initial text. Run 3.", paragraph.getText().trim());
// Insert the first run to the start of the paragraph's child nodes collection.
paragraph.prependChild(run1);
Assert.assertEquals("Run 1. Run 2. Initial text. Run 3.", paragraph.getText().trim());
Assert.assertEquals(4, paragraph.getChildNodes(NodeType.ANY, true).getCount());
// We can modify the contents of the run by editing and deleting existing child nodes.
((Run) paragraph.getChildNodes(NodeType.RUN, true).get(1)).setText("Updated run 2. ");
paragraph.getChildNodes(NodeType.RUN, true).remove(paragraphText);
Assert.assertEquals("Run 1. Updated run 2. Run 3.", paragraph.getText().trim());
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, true).getCount());
getText in class CompositeNodepublic java.lang.Object getDirectParaAttr(int key)
public java.lang.Object getDirectParaAttr(int key,
int revisionsView)
public java.lang.Object fetchInheritedParaAttr(int key)
public java.lang.Object fetchParaAttr(int key)
public void setParaAttr(int key,
java.lang.Object value)
public void removeParaAttr(int key)
public void clearParaAttrs()
public java.lang.Object getDirectRunAttr(int key)
public java.lang.Object getDirectRunAttr(int key,
int revisionsView)
public java.lang.Object fetchInheritedRunAttr(int key)
public void setRunAttr(int key,
java.lang.Object value)
public void removeRunAttr(int key)
public void clearRunAttrs()
public void removeMoveRevisions()
public boolean isListItem()
Examples:
Shows how to nest a list inside another list.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// A list allows us to organize and decorate sets of paragraphs with prefix symbols and indents.
// We can create nested lists by increasing the indent level.
// We can begin and end a list by using a document builder's "ListFormat" property.
// Each paragraph that we add between a list's start and the end will become an item in the list.
// Create an outline list for the headings.
List outlineList = doc.getLists().add(ListTemplate.OUTLINE_NUMBERS);
builder.getListFormat().setList(outlineList);
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.writeln("This is my Chapter 1");
// Create a numbered list.
List numberedList = doc.getLists().add(ListTemplate.NUMBER_DEFAULT);
builder.getListFormat().setList(numberedList);
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.NORMAL);
builder.writeln("Numbered list item 1.");
// Every paragraph that comprises a list will have this flag.
Assert.assertTrue(builder.getCurrentParagraph().isListItem());
Assert.assertTrue(builder.getParagraphFormat().isListItem());
// Create a bulleted list.
List bulletedList = doc.getLists().add(ListTemplate.BULLET_DEFAULT);
builder.getListFormat().setList(bulletedList);
builder.getParagraphFormat().setLeftIndent(72.0);
builder.writeln("Bulleted list item 1.");
builder.writeln("Bulleted list item 2.");
builder.getParagraphFormat().clearFormatting();
// Revert to the numbered list.
builder.getListFormat().setList(numberedList);
builder.writeln("Numbered list item 2.");
builder.writeln("Numbered list item 3.");
// Revert to the outline list.
builder.getListFormat().setList(outlineList);
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.writeln("This is my Chapter 2");
builder.getParagraphFormat().clearFormatting();
builder.getDocument().save(getArtifactsDir() + "Lists.NestedLists.docx");
boolean value.public TabStop[] getEffectiveTabStops()
Examples:
Shows how to set custom tab stops for a paragraph.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
// If we are in a paragraph with no tab stops in this collection,
// the cursor will jump 36 points each time we press the Tab key in Microsoft Word.
Assert.assertEquals(0, doc.getFirstSection().getBody().getFirstParagraph().getEffectiveTabStops().length);
// We can add custom tab stops in Microsoft Word if we enable the ruler via the "View" tab.
// Each unit on this ruler is two default tab stops, which is 72 points.
// We can add custom tab stops programmatically like this.
TabStopCollection tabStops = doc.getFirstSection().getBody().getFirstParagraph().getParagraphFormat().getTabStops();
tabStops.add(72.0, TabAlignment.LEFT, TabLeader.DOTS);
tabStops.add(216.0, TabAlignment.CENTER, TabLeader.DASHES);
tabStops.add(360.0, TabAlignment.RIGHT, TabLeader.LINE);
// We can see these tab stops in Microsoft Word by enabling the ruler via "View" -> "Show" -> "Ruler".
Assert.assertEquals(3, para.getEffectiveTabStops().length);
// Any tab characters we add will make use of the tab stops on the ruler and may,
// depending on the tab leader's value, leave a line between the tab departure and arrival destinations.
para.appendChild(new Run(doc, "\tTab 1\tTab 2\tTab 3"));
doc.save(getArtifactsDir() + "Paragraph.TabStops.docx");
public int joinRunsWithSameFormatting()
Examples:
Shows how to simplify paragraphs by merging superfluous runs.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Insert four runs of text into the paragraph.
builder.write("Run 1. ");
builder.write("Run 2. ");
builder.write("Run 3. ");
builder.write("Run 4. ");
// If we open this document in Microsoft Word, the paragraph will look like one seamless text body.
// However, it will consist of four separate runs with the same formatting. Fragmented paragraphs like this
// may occur when we manually edit parts of one paragraph many times in Microsoft Word.
Paragraph para = builder.getCurrentParagraph();
Assert.assertEquals(4, para.getRuns().getCount());
// Change the style of the last run to set it apart from the first three.
para.getRuns().get(3).getFont().setStyleIdentifier(StyleIdentifier.EMPHASIS);
// We can run the "JoinRunsWithSameFormatting" method to optimize the document's contents
// by merging similar runs into one, reducing their overall count.
// This method also returns the number of runs that this method merged.
// These two merges occurred to combine Runs #1, #2, and #3,
// while leaving out Run #4 because it has an incompatible style.
Assert.assertEquals(2, para.joinRunsWithSameFormatting());
// The number of runs left will equal the original count
// minus the number of run merges that the "JoinRunsWithSameFormatting" method carried out.
Assert.assertEquals(2, para.getRuns().getCount());
Assert.assertEquals("Run 1. Run 2. Run 3. ", para.getRuns().get(0).getText());
Assert.assertEquals("Run 4. ", para.getRuns().get(1).getText());
public Field appendField(int fieldType, boolean updateField) throws java.lang.Exception
java.lang.Exceptionpublic Field appendField(java.lang.String fieldCode) throws java.lang.Exception
Examples:
Shows various ways of appending fields to a paragraph.
Document doc = new Document();
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of appending a field to the end of a paragraph.
// 1 - Append a DATE field using a field type, and then update it:
paragraph.appendField(FieldType.FIELD_DATE, true);
// 2 - Append a TIME field using a field code:
paragraph.appendField(" TIME \\@ \"HH:mm:ss\" ");
// 3 - Append a QUOTE field using a field code, and get it to display a placeholder value:
paragraph.appendField(" QUOTE \"Real value\"", "Placeholder value");
Assert.assertEquals("Placeholder value", doc.getRange().getFields().get(2).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals("Real value", doc.getRange().getFields().get(2).getResult());
doc.save(getArtifactsDir() + "Paragraph.AppendField.docx");
fieldCode - The field code to append (without curly braces).Field object that represents the appended field.java.lang.Exceptionpublic Field appendField(java.lang.String fieldCode, java.lang.String fieldValue)
Examples:
Shows various ways of appending fields to a paragraph.
Document doc = new Document();
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of appending a field to the end of a paragraph.
// 1 - Append a DATE field using a field type, and then update it:
paragraph.appendField(FieldType.FIELD_DATE, true);
// 2 - Append a TIME field using a field code:
paragraph.appendField(" TIME \\@ \"HH:mm:ss\" ");
// 3 - Append a QUOTE field using a field code, and get it to display a placeholder value:
paragraph.appendField(" QUOTE \"Real value\"", "Placeholder value");
Assert.assertEquals("Placeholder value", doc.getRange().getFields().get(2).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals("Real value", doc.getRange().getFields().get(2).getResult());
doc.save(getArtifactsDir() + "Paragraph.AppendField.docx");
fieldCode - The field code to append (without curly braces).fieldValue - The field value to append. Pass null for fields that do not have a value.Field object that represents the appended field.public Field insertField(int fieldType, boolean updateField, Node refNode, boolean isAfter) throws java.lang.Exception
java.lang.Exceptionpublic Field insertField(java.lang.String fieldCode, Node refNode, boolean isAfter) throws java.lang.Exception
Examples:
Shows various ways of adding fields to a paragraph.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of inserting a field into a paragraph.
// 1 - Insert an AUTHOR field into a paragraph after one of the paragraph's child nodes:
Run run = new Run(doc);
{
run.setText("This run was written by ");
}
para.appendChild(run);
doc.getBuiltInDocumentProperties().get("Author").setValue("John Doe");
para.insertField(FieldType.FIELD_AUTHOR, true, run, true);
// 2 - Insert a QUOTE field after one of the paragraph's child nodes:
run = new Run(doc);
{
run.setText(".");
}
para.appendChild(run);
Field field = para.insertField(" QUOTE \" Real value\" ", run, true);
// 3 - Insert a QUOTE field before one of the paragraph's child nodes,
// and get it to display a placeholder value:
para.insertField(" QUOTE \" Real value.\"", " Placeholder value.", field.getStart(), false);
Assert.assertEquals(" Placeholder value.", doc.getRange().getFields().get(1).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals(" Real value.", doc.getRange().getFields().get(1).getResult());
doc.save(getArtifactsDir() + "Paragraph.InsertField.docx");
fieldCode - The field code to insert (without curly braces).refNode - Reference node inside this paragraph (if refNode is null, then appends to the end of the paragraph).isAfter - Whether to insert the field after or before reference node.Field object that represents the inserted field.java.lang.Exceptionpublic Field insertField(java.lang.String fieldCode, java.lang.String fieldValue, Node refNode, boolean isAfter)
Examples:
Shows various ways of adding fields to a paragraph.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
// Below are three ways of inserting a field into a paragraph.
// 1 - Insert an AUTHOR field into a paragraph after one of the paragraph's child nodes:
Run run = new Run(doc);
{
run.setText("This run was written by ");
}
para.appendChild(run);
doc.getBuiltInDocumentProperties().get("Author").setValue("John Doe");
para.insertField(FieldType.FIELD_AUTHOR, true, run, true);
// 2 - Insert a QUOTE field after one of the paragraph's child nodes:
run = new Run(doc);
{
run.setText(".");
}
para.appendChild(run);
Field field = para.insertField(" QUOTE \" Real value\" ", run, true);
// 3 - Insert a QUOTE field before one of the paragraph's child nodes,
// and get it to display a placeholder value:
para.insertField(" QUOTE \" Real value.\"", " Placeholder value.", field.getStart(), false);
Assert.assertEquals(" Placeholder value.", doc.getRange().getFields().get(1).getResult());
// This field will display its placeholder value until we update it.
doc.updateFields();
Assert.assertEquals(" Real value.", doc.getRange().getFields().get(1).getResult());
doc.save(getArtifactsDir() + "Paragraph.InsertField.docx");
fieldCode - The field code to insert (without curly braces).fieldValue - The field value to insert. Pass null for fields that do not have a value.refNode - Reference node inside this paragraph (if refNode is null, then appends to the end of the paragraph).isAfter - Whether to insert the field after or before reference node.Field object that represents the inserted field.