public void LayoutCollector() { //ExStart //ExFor:Layout.LayoutCollector //ExFor:Layout.LayoutCollector.#ctor(Document) //ExFor:Layout.LayoutCollector.Clear //ExFor:Layout.LayoutCollector.Document //ExFor:Layout.LayoutCollector.GetEndPageIndex(Node) //ExFor:Layout.LayoutCollector.GetEntity(Node) //ExFor:Layout.LayoutCollector.GetNumPagesSpanned(Node) //ExFor:Layout.LayoutCollector.GetStartPageIndex(Node) //ExFor:Layout.LayoutEnumerator.Current //ExSummary:Shows how to see the page spans of nodes. // Open a blank document and create a DocumentBuilder Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); // Create a LayoutCollector object for our document that will have information about the nodes we placed LayoutCollector layoutCollector = new LayoutCollector(doc); // The document itself is a node that contains everything, which currently spans 0 pages Assert.AreEqual(doc, layoutCollector.Document); Assert.AreEqual(0, layoutCollector.GetNumPagesSpanned(doc)); // Populate the document with sections and page breaks builder.Write("Section 1"); builder.InsertBreak(BreakType.PageBreak); builder.InsertBreak(BreakType.PageBreak); doc.AppendChild(new Section(doc)); doc.LastSection.AppendChild(new Body(doc)); builder.MoveToDocumentEnd(); builder.Write("Section 2"); builder.InsertBreak(BreakType.PageBreak); builder.InsertBreak(BreakType.PageBreak); // The collected layout data won't automatically keep up with the real document contents Assert.AreEqual(0, layoutCollector.GetNumPagesSpanned(doc)); // After we clear the layout collection and update it, the layout entity collection will be populated with up-to-date information about our nodes // The page span for the document now shows 5, which is what we would expect after placing 4 page breaks layoutCollector.Clear(); doc.UpdatePageLayout(); Assert.AreEqual(5, layoutCollector.GetNumPagesSpanned(doc)); // We can also see the start/end pages of any other node, and their overall page spans NodeCollection nodes = doc.GetChildNodes(NodeType.Any, true); foreach (Node node in nodes) { Console.WriteLine($"-> NodeType.{node.NodeType}: "); Console.WriteLine( $"\tStarts on page {layoutCollector.GetStartPageIndex(node)}, ends on page {layoutCollector.GetEndPageIndex(node)}," + $" spanning {layoutCollector.GetNumPagesSpanned(node)} pages."); } // We can iterate over the layout entities using a LayoutEnumerator LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc); Assert.AreEqual(LayoutEntityType.Page, layoutEnumerator.Type); // The LayoutEnumerator can traverse the collection of layout entities like a tree // We can also point it to any node's corresponding layout entity like this layoutEnumerator.Current = layoutCollector.GetEntity(doc.GetChild(NodeType.Paragraph, 1, true)); Assert.AreEqual(LayoutEntityType.Span, layoutEnumerator.Type); Assert.AreEqual("¶", layoutEnumerator.Text); //ExEnd }
public void LayoutCollector() { //ExStart //ExFor:Layout.LayoutCollector //ExFor:Layout.LayoutCollector.#ctor(Document) //ExFor:Layout.LayoutCollector.Clear //ExFor:Layout.LayoutCollector.Document //ExFor:Layout.LayoutCollector.GetEndPageIndex(Node) //ExFor:Layout.LayoutCollector.GetEntity(Node) //ExFor:Layout.LayoutCollector.GetNumPagesSpanned(Node) //ExFor:Layout.LayoutCollector.GetStartPageIndex(Node) //ExFor:Layout.LayoutEnumerator.Current //ExSummary: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.AreEqual(doc, layoutCollector.Document); Assert.AreEqual(0, layoutCollector.GetNumPagesSpanned(doc)); // Populate the document with 5 pages of content. DocumentBuilder builder = new DocumentBuilder(doc); builder.Write("Section 1"); builder.InsertBreak(BreakType.PageBreak); builder.InsertBreak(BreakType.PageBreak); builder.InsertBreak(BreakType.SectionBreakEvenPage); builder.Write("Section 2"); builder.InsertBreak(BreakType.PageBreak); builder.InsertBreak(BreakType.PageBreak); // 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.AreEqual(0, layoutCollector.GetNumPagesSpanned(doc)); layoutCollector.Clear(); doc.UpdatePageLayout(); Assert.AreEqual(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); foreach (Node node in nodes) { Console.WriteLine($"-> NodeType.{node.NodeType}: "); Console.WriteLine( $"\tStarts on page {layoutCollector.GetStartPageIndex(node)}, ends on page {layoutCollector.GetEndPageIndex(node)}," + $" spanning {layoutCollector.GetNumPagesSpanned(node)} pages."); } // We can iterate over the layout entities using a LayoutEnumerator. LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc); Assert.AreEqual(LayoutEntityType.Page, layoutEnumerator.Type); // 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.Current = layoutCollector.GetEntity(doc.GetChild(NodeType.Paragraph, 1, true)); Assert.AreEqual(LayoutEntityType.Span, layoutEnumerator.Type); Assert.AreEqual("¶", layoutEnumerator.Text); //ExEnd }