tablas salto repetir pie pagina encabezado ejemplos con agregar asp.net c#-4.0 itextsharp

asp.net - salto - Encabezado, pie de página y tablas grandes con iTextSharp



itextsharp salto de pagina (1)

He añadido un encabezado y un pie de página en mi documento por PdfPageEventHelper.

El documento tiene varias tablas "grandes" pobladas en tiempo de ejecución.

Intenté agregar esas tablas simplemente por "documen.Add (tabla)", pero mi encabezado y mis resultados de pie de página se sobrescribieron.

Ya he probado ambos métodos para agregar las tablas (WriteSelectedRows y document.Add (myPdfPtable).

Aquí está el código de PageEventHelper:

private class MyPageEventHandler : PdfPageEventHelper { public iTextSharp.text.Image ImageHeader { get; set; } public iTextSharp.text.Image ImageFooter { get; set; } public override void OnEndPage(PdfWriter writer, Document document) { var fontintestazione = FontFactory.GetFont("Verdana", 10, Font.BOLD, BaseColor.LIGHT_GRAY); var fontRight = FontFactory.GetFont("Verdana", 8, Font.BOLD, BaseColor.WHITE); var fontFooter = FontFactory.GetFont("Verdana", 6, Font.NORMAL, BaseColor.BLUE); float cellHeight = document.TopMargin; Rectangle page = document.PageSize; PdfPTable head = new PdfPTable(3); head.TotalWidth = page.Width; PdfPCell c = new PdfPCell(ImageHeader, true); c.HorizontalAlignment = Element.ALIGN_LEFT; c.FixedHeight = cellHeight; c.Border = PdfPCell.NO_BORDER; head.AddCell(c); c = new PdfPCell(new Phrase("somePhrase", fontintestazione)); c.Border = PdfPCell.NO_BORDER; head.AddCell(c); c = new PdfPCell(new Phrase("someTextBlah", fontRight)); c.Border = PdfPCell.NO_BORDER; c.HorizontalAlignment = 1; c.BackgroundColor = new BaseColor(70, 130, 180); head.AddCell(c); head.WriteSelectedRows(0, -1, 10, page.Height - cellHeight + head.TotalHeight -30, writer.DirectContent); PdfPTable footer = new PdfPTable(2); footer.TotalWidth = 316f; float[] cfWidths = new float[] { 2f, 1f }; footer.SetWidths(cfWidths); PdfPCell cf = new PdfPCell(ImageFooter, true); cf.HorizontalAlignment = Element.ALIGN_RIGHT; cf.FixedHeight = cellHeight; cf.Border = PdfPCell.NO_BORDER; footer.AddCell(cf); cf = new PdfPCell(new Phrase("someEndingText", fontFooter)); cf.HorizontalAlignment = Element.ALIGN_LEFT; cf.Border = PdfPCell.NO_BORDER; footer.AddCell(cf); footer.WriteSelectedRows(0, -1, 10, 50, writer.DirectContent); }

En mi página, simplemente hago:

var document = new Document(PageSize.A4); var output = new MemoryStream(); var writer = PdfWriter.GetInstance(document, output); iTextSharp.text.Image imageHeader = iTextSharp.text.Image.GetInstance(Server.MapPath("/images/header.ong")); iTextSharp.text.Image imageFooter = iTextSharp.text.Image.GetInstance(Server.MapPath("/images/footer.png")); MyPageEventHandler eve = new MyPageEventHandler { ImageHeader = imageHeader , ImageFooter = imageFooter }; writer.PageEvent = eve; document.Open(); //adding a table PdfPTable cvTable = new PdfPtable(3); cvTable.TotalWidth = document.PageSize.Width; PdfPCell hCell = new PdfPCell(new Phrase("Jobs By User", aCustomFont)); cvTable.AddCell(hCell); for(int i = 0; i < myTable.Records.Count; i++) { PdfPCell idCell = new PdfPCell(new Phrase(myTable.Records[i]._id, aFont)); cvTable.Add(idCell); //same stuff for other fields of table } //first attempt.... failed: document.Add(cvTable) //<- header and footer are overwritten by table //second attempt..... failed too... cvTable.WriteSelectedRows(0, -1, 10, myPoisition, writer.DirectContent); //kind of fail...: //the table is large and need more pages. It is trunked on the first page and overwrite //the footer.


En su método OnEndPage tiene esta línea:

head.WriteSelectedRows(0, -1, 10, page.Height - cellHeight + head.TotalHeight - 30, writer.DirectContent);

Ese código calcula correctamente dónde colocar el contenido según la altura de la página y el margen superior, pero también incluye un mágico 30 que hace que el encabezado se dibuje en la parte superior de la tabla. Cámbielo a esto y su encabezado estará bien.

head.WriteSelectedRows(0, -1, 10, page.Height - cellHeight + head.TotalHeight, writer.DirectContent);

Supongo que ese 30 está tratando de incluir algo de relleno entre tu encabezado y la tabla en sí. Lo que recomendaría es cambiar los márgenes del documento en el código principal:

document.SetMargins(document.LeftMargin, document.RightMargin, document.TopMargin + 30, document.BottomMargin);

Y luego contabilizando eso en el método OnEndPage :

float cellHeight = document.TopMargin - 30;

Su código de pie de página no representa el margen inferior y solo lo dibuja en 50 por lo que siempre se superpondrá. La solución rápida sería cambiarlo a:

footer.WriteSelectedRows(0, -1, 10, footer.TotalHeight, writer.DirectContent);

Esto al menos hará que el pie de página se alinee con el fondo. Si desea un relleno más como el anterior, simplemente ajuste los márgenes del documento nuevamente:

document.SetMargins(document.LeftMargin, document.RightMargin, document.TopMargin + 30, document.BottomMargin + 30);