public class LayoutEnumerator
extends java.lang.Object
LayoutCollector.getEntity(com.aspose.words.Node) and getCurrent() / setCurrent(java.lang.Object) move to the entity which corresponds to a document node.
To learn more, visit the Converting to Fixed-page Format documentation article.
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
| Constructor and Description |
|---|
LayoutEnumerator(Document document)
Initializes new instance of this class.
|
| Modifier and Type | Method and Description |
|---|---|
java.lang.Object |
get(java.lang.String key)
Gets a named property of the entity.
|
java.lang.Object |
getCurrent()
Gets current position in the page layout model.
|
Document |
getDocument()
Gets document this instance enumerates.
|
java.lang.String |
getKind()
Gets the kind of the current entity.
|
int |
getPageIndex()
Gets the 1-based index of a page which contains the current entity.
|
java.awt.geom.Rectangle2D.Float |
getRectangle()
Returns the bounding rectangle of the current entity relative to the page top left corner (in points).
|
java.lang.String |
getText()
Gets text of the current span entity.
|
int |
getType()
Gets the type of the current entity.
|
boolean |
moveFirstChild()
Moves to the first child entity.
|
boolean |
moveLastChild()
Moves to the last child entity.
|
boolean |
moveNext()
Moves to the next sibling entity in visual order.
|
boolean |
moveNextLogical()
Moves to the next sibling entity in a logical order.
|
boolean |
moveParent()
Moves to the parent entity.
|
boolean |
moveParent(int types) |
boolean |
movePrevious()
Moves to the previous sibling entity.
|
boolean |
movePreviousLogical()
Moves to the previous sibling entity in a logical order.
|
void |
reset()
Moves the enumerator to the first page of the document.
|
void |
setCurrent(java.lang.Object value)
Sets current position in the page layout model.
|
public LayoutEnumerator(Document document) throws java.lang.Exception
Remarks:
If page layout model of the document hasn't been built the enumerator calls Document.updatePageLayout() to build it.
Whenever document is updated and new page layout model is created, a new enumerator must be used to access it.
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
document - A document whose page layout model to enumerate.java.lang.Exceptionpublic void reset()
throws java.lang.Exception
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
java.lang.Exceptionpublic boolean moveNext()
throws java.lang.Exception
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
java.lang.Exceptionpublic boolean moveNextLogical()
Remarks:
Note that all LayoutEntityType.SPAN entities are linked together thus if getCurrent() / setCurrent(java.lang.Object) entity is span repeated calling of this method will iterates complete story of the document.
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
public boolean movePrevious()
throws java.lang.Exception
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
java.lang.Exceptionpublic boolean movePreviousLogical()
Remarks:
Note that all LayoutEntityType.SPAN entities are linked together thus if getCurrent() / setCurrent(java.lang.Object) entity is span repeated calling of this method will iterates complete story of the document.
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
public boolean moveFirstChild()
throws java.lang.Exception
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
java.lang.Exceptionpublic boolean moveLastChild()
throws java.lang.Exception
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
java.lang.Exceptionpublic boolean moveParent()
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
public boolean moveParent(int types)
public int getType()
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
LayoutEntityType constants.public java.awt.geom.Rectangle2D.Float getRectangle()
throws java.lang.Exception
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
java.lang.Exceptionpublic java.lang.String getKind()
throws java.lang.Exception
null.
Remarks:
This is a more specific type of the current entity, e.g. bookmark span has LayoutEntityType.SPAN type and may have either a BOOKMARKSTART or BOOKMARKEND kind.
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
java.lang.Exceptionpublic java.lang.String getText()
throws java.lang.Exception
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
java.lang.Exceptionpublic int getPageIndex()
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
public java.lang.Object getCurrent()
Examples:
Shows how to see the the ranges of pages that a node spans.
Document doc = new Document();
LayoutCollector layoutCollector = new LayoutCollector(doc);
// Call the "GetNumPagesSpanned" method to count how many pages the content of our document spans.
// Since the document is empty, that number of pages is currently zero.
Assert.assertEquals(doc, layoutCollector.getDocument());
Assert.assertEquals(0, layoutCollector.getNumPagesSpanned(doc));
// Populate the document with 5 pages of content.
DocumentBuilder builder = new DocumentBuilder(doc);
builder.write("Section 1");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.insertBreak(BreakType.PAGE_BREAK);
builder.insertBreak(BreakType.SECTION_BREAK_EVEN_PAGE);
builder.write("Section 2");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.insertBreak(BreakType.PAGE_BREAK);
// Before the layout collector, we need to call the "UpdatePageLayout" method to give us
// an accurate figure for any layout-related metric, such as the page count.
Assert.assertEquals(0, layoutCollector.getNumPagesSpanned(doc));
layoutCollector.clear();
doc.updatePageLayout();
Assert.assertEquals(5, layoutCollector.getNumPagesSpanned(doc));
// We can see the numbers of the start and end pages of any node and their overall page spans.
NodeCollection nodes = doc.getChildNodes(NodeType.ANY, true);
for (Node node : (Iterable<Node>) nodes) {
System.out.println(MessageFormat.format("-> NodeType.{0}: ", node.getNodeType()));
System.out.println(MessageFormat.format("\tStarts on page {0}, ends on page {1},", layoutCollector.getStartPageIndex(node), layoutCollector.getEndPageIndex(node)) +
MessageFormat.format(" spanning {0} pages.", layoutCollector.getNumPagesSpanned(node)));
}
// We can iterate over the layout entities using a LayoutEnumerator.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
// The LayoutEnumerator can traverse the collection of layout entities like a tree.
// We can also apply it to any node's corresponding layout entity.
layoutEnumerator.setCurrent(layoutCollector.getEntity(doc.getChild(NodeType.PARAGRAPH, 1, true)));
Assert.assertEquals(LayoutEntityType.SPAN, layoutEnumerator.getType());
Assert.assertEquals("¶", layoutEnumerator.getText());
public void setCurrent(java.lang.Object value)
throws java.lang.Exception
Examples:
Shows how to see the the ranges of pages that a node spans.
Document doc = new Document();
LayoutCollector layoutCollector = new LayoutCollector(doc);
// Call the "GetNumPagesSpanned" method to count how many pages the content of our document spans.
// Since the document is empty, that number of pages is currently zero.
Assert.assertEquals(doc, layoutCollector.getDocument());
Assert.assertEquals(0, layoutCollector.getNumPagesSpanned(doc));
// Populate the document with 5 pages of content.
DocumentBuilder builder = new DocumentBuilder(doc);
builder.write("Section 1");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.insertBreak(BreakType.PAGE_BREAK);
builder.insertBreak(BreakType.SECTION_BREAK_EVEN_PAGE);
builder.write("Section 2");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.insertBreak(BreakType.PAGE_BREAK);
// Before the layout collector, we need to call the "UpdatePageLayout" method to give us
// an accurate figure for any layout-related metric, such as the page count.
Assert.assertEquals(0, layoutCollector.getNumPagesSpanned(doc));
layoutCollector.clear();
doc.updatePageLayout();
Assert.assertEquals(5, layoutCollector.getNumPagesSpanned(doc));
// We can see the numbers of the start and end pages of any node and their overall page spans.
NodeCollection nodes = doc.getChildNodes(NodeType.ANY, true);
for (Node node : (Iterable<Node>) nodes) {
System.out.println(MessageFormat.format("-> NodeType.{0}: ", node.getNodeType()));
System.out.println(MessageFormat.format("\tStarts on page {0}, ends on page {1},", layoutCollector.getStartPageIndex(node), layoutCollector.getEndPageIndex(node)) +
MessageFormat.format(" spanning {0} pages.", layoutCollector.getNumPagesSpanned(node)));
}
// We can iterate over the layout entities using a LayoutEnumerator.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
// The LayoutEnumerator can traverse the collection of layout entities like a tree.
// We can also apply it to any node's corresponding layout entity.
layoutEnumerator.setCurrent(layoutCollector.getEntity(doc.getChild(NodeType.PARAGRAPH, 1, true)));
Assert.assertEquals(LayoutEntityType.SPAN, layoutEnumerator.getType());
Assert.assertEquals("¶", layoutEnumerator.getText());
value - Current position in the page layout model.java.lang.Exceptionpublic Document getDocument()
Examples:
Shows ways of traversing a document's layout entities.
public void layoutEnumerator() throws Exception {
// Open a document that contains a variety of layout entities.
// Layout entities are pages, cells, rows, lines, and other objects included in the LayoutEntityType enum.
// Each layout entity has a rectangular space that it occupies in the document body.
Document doc = new Document(getMyDir() + "Layout entities.docx");
// Create an enumerator that can traverse these entities like a tree.
LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);
Assert.assertEquals(doc, layoutEnumerator.getDocument());
layoutEnumerator.moveParent(LayoutEntityType.PAGE);
Assert.assertEquals(LayoutEntityType.PAGE, layoutEnumerator.getType());
Assert.assertThrows(IllegalStateException.class, () -> System.out.println(layoutEnumerator.getText()));
// We can call this method to make sure that the enumerator will be at the first layout entity.
layoutEnumerator.reset();
// There are two orders that determine how the layout enumerator continues traversing layout entities
// when it encounters entities that span across multiple pages.
// 1 - In visual order:
// When moving through an entity's children that span multiple pages,
// page layout takes precedence, and we move to other child elements on this page and avoid the ones on the next.
System.out.println("Traversing from first to last, elements between pages separated:");
traverseLayoutForward(layoutEnumerator, 1);
// Our enumerator is now at the end of the collection. We can traverse the layout entities backwards to go back to the beginning.
System.out.println("Traversing from last to first, elements between pages separated:");
traverseLayoutBackward(layoutEnumerator, 1);
// 2 - In logical order:
// When moving through an entity's children that span multiple pages,
// the enumerator will move between pages to traverse all the child entities.
System.out.println("Traversing from first to last, elements between pages mixed:");
traverseLayoutForwardLogical(layoutEnumerator, 1);
System.out.println("Traversing from last to first, elements between pages mixed:");
traverseLayoutBackwardLogical(layoutEnumerator, 1);
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNext());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Visual" order.
/// </summary>
private static void traverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackward(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePrevious());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection front-to-back,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveFirstChild()) {
traverseLayoutForwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.moveNextLogical());
}
/// <summary>
/// Enumerate through layoutEnumerator's layout entity collection back-to-front,
/// in a depth-first manner, and in the "Logical" order.
/// </summary>
private static void traverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth) throws Exception {
do {
printCurrentEntity(layoutEnumerator, depth);
if (layoutEnumerator.moveLastChild()) {
traverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
layoutEnumerator.moveParent();
}
} while (layoutEnumerator.movePreviousLogical());
}
/// <summary>
/// Print information about layoutEnumerator's current entity to the console, while indenting the text with tab characters
/// based on its depth relative to the root node that we provided in the constructor LayoutEnumerator instance.
/// The rectangle that we process at the end represents the area and location that the entity takes up in the document.
/// </summary>
private static void printCurrentEntity(LayoutEnumerator layoutEnumerator, int indent) throws Exception {
String tabs = StringUtils.repeat("\t", indent);
System.out.println(layoutEnumerator.getKind().equals("")
? MessageFormat.format("{0}-> Entity type: {1}", tabs, layoutEnumerator.getType())
: MessageFormat.format("{0}-> Entity type & kind: {1}, {2}", tabs, layoutEnumerator.getType(), layoutEnumerator.getKind()));
// Only spans can contain text.
if (layoutEnumerator.getType() == LayoutEntityType.SPAN)
System.out.println("{tabs} Span contents: \"{layoutEnumerator.Text}\"");
Rectangle2D.Float leRect = layoutEnumerator.getRectangle();
System.out.println(MessageFormat.format("{0} Rectangle dimensions {1}x{2}, X={3} Y={4}", tabs, leRect.getWidth(), leRect.getHeight(), leRect.getX(), leRect.getY()));
System.out.println(MessageFormat.format("{0} Page {1}", tabs, layoutEnumerator.getPageIndex()));
}
public java.lang.Object get(java.lang.String key)
Remarks:
This is currently used to get font properties of spans. See Font class for possible properties names. Not all properties are supported.
key - A name of the property (case-sensitive).