Wie gehe ich mit dem Fall um, in dem eine iText \ iTextSharp-Tabelle auf zwei Seiten aufgeteilt ist?

Ich habe das folgende Problem mit iTextSharp.

Ich füge einige Tabellen in mein Dokument ein. Das Problem ist, dass, wenn ein Tabelleninhalt nicht auf eine Seite passt und auf eine andere Seite wechselt, der zweite Seitenkopf überschrieben wird.

Wie Sie sehen, füge ich eine Tabelle am Ende einer Seite ein und diese wird in zwei Seiten aufgeteilt und der zweite Seitenkopf wird durch den Tabelleninhalt überschrieben.

Ich möchte diese Situation vermeiden, aber ich weiß nicht, wie ich es machen soll.

Ich denke, dass ich vielleicht eines der folgenden Dinge tun kann:

1) Vielleicht kann ich überprüfen, ob ein Element vollständig in eine Seite eingeht. Wenn nicht, erstelle eine neue Seite und füge sie in diese neue Seite ein (aber dies kann ein Problem sein, wenn eine einzelne Tabelle mehr als eine Seite benötigt, falls ich eine sehr große Tabelle habe)

2) Ich erlaube, dass eine Tabelle in zwei Seiten aufgeteilt wird, aber in diesem Fall habe ich oben auf der zweiten Seite einen gewissen Randabstand gelassen, damit die Kopfzeile korrekt angezeigt wird.

Oder was kann ich tun, um diese Situation zu lösen?

Tnx

BEARBEITEN:

Ich habe den Header folgendermaßen hinzugefügt:

1) Ich habe eine Klasse namens create implementiertPdfHeaderFooter das erweitert diePdfPageEventHelper Klasse und das implementiert seine Methoden.

Zu diesem Zeitpunkt enthält seine Klasse die folgenden Methoden:

    // 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();
    }

So können Sie sehen, werOnStartPage () Methode fügen Sie den Header am Anfang jeder Seite und dieOnEndPage () Fügen Sie die Fußzeile am Ende jeder Seite hinzu.

Nach dem, was ich aus Ihrer Antwort verstehe, muss ich die folgenden Schritte ausführen:

1) Bewegen Sie die Kopfzeile vonOnStartPage () zuOnEndPage ()

2) Verwenden Sie eine absolute Position, um es im oberen Teil der Seiten zu platzieren.

3) Verwenden Sie bei der Dokumentenerstellung die Kopfzeile, um den oberen Rand festzulegen.

Ist es richtig?

EDIT 2:

Ich habe versucht, das zu tun, was du mir sagst, und jetzt habe ich die folgenden Situationen:

1) In meinePdfHeaderFooter das erstreckt sichPdfPageEventHelper Ich habe die gelöschtOnStartPage () Methode

2) Ich habe die Erstellung der Headertabelle in dieOnEndPage () Methode, die jetzt es dieses:

    // 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();
    }

Wie Sie jetzt sehen könnenOnEndPage () Methode enthält die Erstellung der Kopf- und Fußzeile.

Es scheint mir, dasstabHead (meine Headertabelle) benutze die absolute Positionierung, weil ich:

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

In der anderen Klasse, in der ich das Dokument erstelle, habe ich diese Zeile:

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

Die Seiten sind also A4 und haben 30 Pixel als oberen Rand.

Aber ich habe immer noch das gleiche Problem.

Wenn ich den Wert 30 mit 80 ändere, verschiebt er sich einfach in der Kopfzeile nach unten und hinterlässt eine weiße Spitze, löst aber das Problem nicht.

Was vermisse ich? Was ist falsch?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage