2010-02-23 58 views
5

Necesito una tabla con aproximadamente 12 celdas para mostrar como encabezado. El siguiente código no puede hacer esto. Soy consciente de que table2 no tiene 12 celdas. En la segunda página, solo se muestra "prueba". ¿Qué me estoy perdiendo?PdfPTable como encabezado en iTextSharp

¡Gracias de antemano!

Document document = new Document(); 

     try 
     { 
      PdfWriter.GetInstance(document, new FileStream("TableTest.pdf", FileMode.Create)); 
      document.Open(); 

      PdfPTable table = new PdfPTable(1); 
      table.WidthPercentage = 100; 
      PdfPTable table2 = new PdfPTable(2); 

      //logo 
      PdfPCell cell2 = new PdfPCell(Image.GetInstance(@"C:\path\to\file.gif")); 
      cell2.Colspan = 2; 
      table2.AddCell(cell2); 

      //title 
      cell2 = new PdfPCell(new Phrase("\nTITLE TEXT", new Font(Font.HELVETICA, 16, Font.BOLD | Font.UNDERLINE))); 
      cell2.HorizontalAlignment = Element.ALIGN_CENTER; 
      cell2.Colspan = 2; 
      table2.AddCell(cell2); 

      PdfPCell cell = new PdfPCell(table2); 
      table.HeaderRows = 1; 
      table.AddCell(cell); 
      table.AddCell(new PdfPCell(new Phrase(""))); 

      document.Add(table); 

      document.Add(new Phrase("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ntesting")); 
     } 
     catch (DocumentException de) 
     { 
      Console.Error.WriteLine(de.Message); 
     } 
     catch (IOException ioe) 
     { 
      Console.Error.WriteLine(ioe.Message); 
     } 

     document.Close(); 

Respuesta

11

Bingo! La clase PdfPageEventHandler funcionó para mí.

he utilizado la PdfPageEventHelper reemplazando el método OnEndPage:

class _events : PdfPageEventHelper 
{ 
    public override void OnEndPage(PdfWriter writer, Document document) 
    { 
     PdfPTable table = new PdfPTable(1); 
     //table.WidthPercentage = 100; //PdfPTable.writeselectedrows below didn't like this 
     table.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin; //this centers [table] 
     PdfPTable table2 = new PdfPTable(2); 

     //logo 
     PdfPCell cell2 = new PdfPCell(Image.GetInstance(@"C:\path\to\file.gif")); 
     cell2.Colspan = 2; 
     table2.AddCell(cell2); 

     //title 
     cell2 = new PdfPCell(new Phrase("\nTITLE", new Font(Font.HELVETICA, 16, Font.BOLD | Font.UNDERLINE))); 
     cell2.HorizontalAlignment = Element.ALIGN_CENTER; 
     cell2.Colspan = 2; 
     table2.AddCell(cell2); 

     PdfPCell cell = new PdfPCell(table2); 
     table.AddCell(cell); 

     table.WriteSelectedRows(0, -1, document.LeftMargin, document.PageSize.Height - 36, writer.DirectContent); 
    } 
} 

entonces, construir pdf

Document document = new Document(PageSize.A4, 36, 36, 36 + <height of table>, 36); // note height should be set here 
_events e = new _events(); 
PdfWriter pw = PdfWriter.GetInstance(document, new FileStream("TableTest.pdf", FileMode.Create)); 
pw.PageEvent = e; 
document.Open(); 

for(int i=0;i<100;i++) 
{ 
    document.Add(new Phrase("TESTING\n")); 
} 

document.Close(); 
0

Esto no va a funcionar si usted tiene más de una página. Si tiene más de una página, entonces necesita usar el evento OnStartPage en lugar del evento onEndPage.

1

Utilicé un enfoque muy simple para agregar una fila de encabezado en cada página, al crear un PdfPTable con 'n' filas, donde 'n' podría ser cualquier número entero. Estoy usando iTextSharp 4.0.4.0.

Por lo tanto, puede crear una tabla con 1000 filas o 2 filas o 5000 filas, pero iTextSharp buscará automáticamente la salida por usted. Lo que iTextSharp no hará es agregar automáticamente un encabezado al inicio de cada página.

Para añadir una fila de encabezado de cada página, lo único que hice fue agregar la línea de código después de crear el PdfPTable con todas sus filas y celdas, y luego iTextSharp paginada automáticamente la salida con una fila de encabezado. 'tabla' es la instancia de PdfPTable que creé en mi código antes de establecer su propiedad HeaderRows.

table.HeaderRows = 1; //this will automatically insert a header row 
         //at start of every page. The first row you created 
         //in your code will be used as the header row in this case. 
Cuestiones relacionadas