¿Cómo manejar el caso en el que una tabla iText \ iTextSharp se divide en dos páginas?

Tengo el siguiente problema al usar iTextSharp.

Estoy poniendo algunas tablas en mi documento. El problema es que si el contenido de una tabla no cabe en una página y entra en otra página, tengo que sobrescribir el encabezado de la segunda página, por lo que tengo la siguiente situación:

Como puede ver, estoy insertando una tabla al final de una página y esta se divide en dos páginas y el contenido de la tabla sobrescribe el encabezado de la segunda página.

Quiero evitar esta situación pero no sé cómo debo hacerlo.

Estoy pensando que tal vez pueda hacer una de las siguientes cosas:

1) Tal vez pueda verificar si un elemento entra completamente en una página. Si no, cree una nueva página y colóquela en esta nueva página (pero esto puede ser un problema si una sola tabla necesita más de una página, en el caso de que tenga una tabla muy grande)

2) Permito que una tabla se divida en 2 páginas, pero en este caso dejé un margen de margen en la parte superior de la segunda página para que el encabezado se muestre correctamente.

¿O qué puedo hacer para resolver esta situación?

TNX

EDITAR:

He agregado el encabezado de la siguiente manera:

1) He implementado crear una clase llamadaPdfHeaderFooter eso extiende elPdfPageEventHelper clase y que implementa sus métodos.

En este momento su clase contiene los siguientes métodos:

    // write on start of each page
    public override void OnStartPage(PdfWriter writer, Document document)
    {
        base.OnStartPage(writer, document);
        PdfPTable tabHead = new PdfPTable(3);
        tabHead.SetWidths(new int[] { 165, 205, 125 });

        //tabHead.TotalWidth = 460F;
        tabHead.TotalWidth = document.Right - document.Left;        // TotalWidth = 495
        tabHead.WidthPercentage = 98;


        PdfPCell cell1 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "logoEarlyWarning.png"), true) { Border = PdfPCell.BOTTOM_BORDER };
        tabHead.AddCell(cell1);
        //tabHead.AddCell(new PdfPCell(new Phrase("CELL 1:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15, });

        tabHead.AddCell(new PdfPCell(new Phrase("")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15 });

        if(_sourceId == "NVD")
        {
            iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(folderImages + "nvdLogo.png");
            logo.ScalePercent(48f);
            //PdfPCell cell3 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "nvdLogo.png"), true) { Border = PdfPCell.BOTTOM_BORDER, PaddingBottom = 25 };
            PdfPCell cell3 = new PdfPCell(logo) { Border = PdfPCell.BOTTOM_BORDER, PaddingLeft = 50 };
            tabHead.AddCell(cell3);
        }
        else if(_sourceId == "DeepSight")
        {
            PdfPCell cell3 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "DSLogo.jpg"), true) { Border = PdfPCell.BOTTOM_BORDER };
            tabHead.AddCell(cell3);
        }
        //tabHead.AddCell(new PdfPCell(new Phrase("CELL 3:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15 });


        tabHead.WriteSelectedRows(0, -1, document.Left, document.Top, writer.DirectContent);
    }

    // write on end of each page
    public override void OnEndPage(PdfWriter writer, Document document)
    {
        base.OnEndPage(writer, document);

        int pageN = writer.PageNumber;      // numero della pagina corrente OK
        String text = "Page " + pageN + " of ";
        float len = bf.GetWidthPoint(text, 8);

        Rectangle pageSize = document.PageSize;

        cb.SetRGBColorFill(100, 100, 100);

        cb.BeginText();
        cb.SetFontAndSize(bf, 8);
        cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetBottom(30));
        cb.ShowText(text);
        cb.EndText();

        cb.AddTemplate(template, pageSize.GetLeft(40) + len, pageSize.GetBottom(30));

        cb.BeginText();
        cb.SetFontAndSize(bf, 8);
        cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT,
            "Printed On " + PrintTime,
            pageSize.GetRight(40),
            pageSize.GetBottom(30), 0);
        cb.EndText();
    }

Entonces, como pueden ver, elOnStartPage () método agregue el encabezado al comienzo de cada página y elOnEndPage () agregue el pie de página al final de cada página.

Entonces, por lo que entiendo por su respuesta, tengo que hacer los siguientes pasos:

1) Mueva la inserción del encabezado desdeOnStartPage () aOnEndPage ()

2) Use una posición absoluta para colocarlo en la parte superior de las páginas.

3) En la creación del documento, use la altura del encabezado para establecer el margen superior.

¿Es correcto?

EDITAR 2:

Intenté hacer lo que me dices y ahora tengo las siguientes situaciones:

1) en miPdfHeaderFooter eso se extiendePdfPageEventHelper He eliminado elOnStartPage () método

2) He movido la creación de la tabla de encabezado en elOnEndPage () método que ahora este:

    // write on end of each page
    public override void OnEndPage(PdfWriter writer, Document document)
    {
        base.OnEndPage(writer, document);

        // HEADER:
        PdfPTable tabHead = new PdfPTable(3);
        tabHead.SetWidths(new int[] { 165, 205, 125 });

        //tabHead.TotalWidth = 460F;
        tabHead.TotalWidth = document.Right - document.Left;        // TotalWidth = 495
        tabHead.WidthPercentage = 98;

        PdfPCell cell1 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "logoEarlyWarning.png"), true) { Border = PdfPCell.BOTTOM_BORDER };
        tabHead.AddCell(cell1);
        //tabHead.AddCell(new PdfPCell(new Phrase("CELL 1:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15, });

        tabHead.AddCell(new PdfPCell(new Phrase("")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15 });

        if (_sourceId == "NVD")
        {
            iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(folderImages + "nvdLogo.png");
            logo.ScalePercent(48f);
            //PdfPCell cell3 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "nvdLogo.png"), true) { Border = PdfPCell.BOTTOM_BORDER, PaddingBottom = 25 };
            PdfPCell cell3 = new PdfPCell(logo) { Border = PdfPCell.BOTTOM_BORDER, PaddingLeft = 50 };
            tabHead.AddCell(cell3);
        }
        else if (_sourceId == "DeepSight")
        {
            PdfPCell cell3 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "DSLogo.jpg"), true) { Border = PdfPCell.BOTTOM_BORDER };
            tabHead.AddCell(cell3);
        }
        //tabHead.AddCell(new PdfPCell(new Phrase("CELL 3:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15 });


        tabHead.WriteSelectedRows(0, -1, document.Left, document.Top, writer.DirectContent);

        float headerHeight = tabHead.CalculateHeights();



        // FOOTER:
        int pageN = writer.PageNumber;      // numero della pagina corrente OK
        String text = "Page " + pageN + " of ";
        float len = bf.GetWidthPoint(text, 8);

        Rectangle pageSize = document.PageSize;

        cb.SetRGBColorFill(100, 100, 100);

        cb.BeginText();
        cb.SetFontAndSize(bf, 8);
        cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetBottom(30));
        cb.ShowText(text);
        cb.EndText();

        cb.AddTemplate(template, pageSize.GetLeft(40) + len, pageSize.GetBottom(30));

        cb.BeginText();
        cb.SetFontAndSize(bf, 8);
        cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT,
            "Printed On " + PrintTime,
            pageSize.GetRight(40),
            pageSize.GetBottom(30), 0);
        cb.EndText();
    }

Como puedes ver ahora elOnEndPage () El método contiene la creación del encabezado y pie de página.

Me parece quetabHead (mi tabla de encabezado) uso el posicionamiento absoluto porque tengo:

tabHead.WriteSelectedRows(0, -1, document.Left, document.Top, writer.DirectContent);

En la otra clase donde creo el documento tengo esta línea:

document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 50, 50, 30, 65);

entonces las páginas son A4 y tienen 30px como margen superior.

Pero todavía tengo el mismo problema.

Si cambio el valor 30 con 80, simplemente se mueve hacia abajo del encabezado dejando una parte superior blanca pero no resuelve el problema.

¿Qué me estoy perdiendo? ¿Qué está mal?

Respuestas a la pregunta(1)

Su respuesta a la pregunta