Como determinar la posicion actual de la hoja que se esta trabajando aspose.wrods

HOla, necesito ayuda, tengo un problema para detectar la posicion dentro de una pagina donde estoy escribiendo un texto con aspose.words, me explico, necesito saber si llegue al final del documento para dar un salto de pagina en caso sea necesario, por que aveces los titulos quedan en una pagina anterior y el cuerpo en una pagina siguiente, entonces la idea es unificarlos, entonces no me es posible detectar la posicion para hacer este salto de pagina, esta es mi funcion que inserta textos o titulos:

public static void  InsertTextWithFormatting(DocumentAspose doc, string texto, string fontFamily, double fontSize, bool bold, bool italic, bool underline, ParagraphAlignment alignment, double spacingAfter)
{
    DocumentBuilder builder = new DocumentBuilder(doc);

    // Restablecer el formato de la lista
    builder.ListFormat.RemoveNumbers();

    builder.MoveToDocumentEnd();
    builder.Font.Name = fontFamily;
    builder.Font.Size = fontSize;
    builder.Font.Bold = bold;
    builder.Font.Italic = italic;
    builder.Font.Underline = underline ? Underline.Single : Underline.None;
    builder.ParagraphFormat.Alignment = alignment;
    builder.ParagraphFormat.SpaceAfter = spacingAfter;
    builder.Write(texto);
    builder.InsertParagraph();
}

pero tambien inserto tablas antes de estit titulos o despues de ellos, entonces necesito saber que posicion estoy de la hoja en curso tomando en cuenta las tablas o imagenes o demas que inserto a la pagina para poder hacer un salto de pagina. podrian ayudarme?

@herrick.davis Para lograr lo que necesita no es necesario calcular el espacio disponible en la página. Simplemente puede usar la opción “KeepWithNext” del párrafo para mantener los encabezados con contenido. Consulte el siguiente código que demuestra la técnica:

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Set keep with nest in the heading 1 style.
doc.Styles[StyleIdentifier.Heading1].ParagraphFormat.KeepWithNext = true;

// Generate some random content.
for (int i = 0; i < 10; i++)
{
    builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading1;
    builder.Writeln("Heading_" + i);
    builder.ParagraphFormat.ClearFormatting();
    builder.StartTable();
    for (int j = 0; j < 25; j++)
    {
        for (int k = 0; k < 5; k++)
        {
            builder.InsertCell();
            // Set keep with next in the table 
            builder.ParagraphFormat.KeepWithNext = true;
            builder.Write($"cell_{j}_{k}");
        }
        builder.EndRow();
    }
    Table table = builder.EndTable();

    // Reset keep with next in the last row in the table.
    foreach (Paragraph p in table.LastRow.GetChildNodes(NodeType.Paragraph, true))
        p.ParagraphFormat.KeepWithNext = false;
}

doc.Save(@"C:\Temp\out.docx");

El encabezado y los párrafos siguientes deben tener configurada la opción “KeepWithNext”, pero el párrafo anterior al siguiente encabezado debe tener esta opción deshabilitada (en el caso de una tabla, los párrafos de la última fila). Aquí está el resultado producido, como puede ver, los encabezados se mantienen con las tablas correspondientes:
out.docx (11.1 KB)

Podria ser una alternativa, pero pasa que yo para insertar por ejemplo un texto llamo a la funcion que les indique, para insertar un encabezado de una tabla llamo a otra funcion y para insertar el contenido de esa tabla llamo a otra funcion, y asi tengo otras funciones que hacen insercion de tablas y filas de diversas formas, por ejemplo en Interop de Work hay una funcion que es esta:

oRng = document.Bookmarks.get_Item(ref oEndOfDoc).Range;

 PositionRange = oRng.Information[Word.WdInformation.wdVerticalPositionRelativeToPage];
 if (PositionRange > Position640)
     oRng.InsertBreak(Word.WdBreakType.wdSectionBreakNextPage); 

detecta la posicion vertical, con eso aplicado a Aspose yo podria detectar la posicion de un texto antes de insertarlo y hacer un salto de pagina si es necesario, ahora en base a lo que comente respecto a las tablas seria un poco dificl poder insertar un KeepWithNext, podrias ayudarme?

@herrick.davis Como sabrá, los documentos de MS Word son documentos fluidos y no contienen ninguna información sobre el diseño del documento. Las aplicaciones de consumo como MS Word u Open Office crean el diseño del documento sobre la marcha. Aspose.Words tiene su propio motor de diseño de documentos. Las clases de fachada LayoutCollector y LayoutEnumerator permiten obtener información de diseño de los elementos del documento.

Por ejemplo, puede utilizar el siguiente código para calcular la posición de los nodos:

Document doc = new Document(@"C:\Temp\in.docx");
LayoutCollector collector = new LayoutCollector(doc);
LayoutEnumerator enumerator = new LayoutEnumerator(doc);

// move enumerator into the paragraph
enumerator.Current = collector.GetEntity(doc.LastSection.Body.LastParagraph);
Console.WriteLine(enumerator.Rectangle);