2010-02-23 10 views
5

Ich brauche eine Tabelle mit etwa 12 Zellen als Kopfzeile anzuzeigen. Der folgende Code schlägt das nicht vor. Ich bin mir bewusst, dass Tabelle2 keine 12 Zellen hat. Auf der zweiten Seite wird nur "Testen" angezeigt. Was vermisse ich?PdfPTable als Kopfzeile in iTextSharp

Vielen Dank im Voraus!

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

Antwort

11

Bingo! PdfPageEventHandler Klasse funktionierte für mich.

nutzte ich die PdfPageEventHelper die OnEndPage Methode überschrieben:

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

dann, 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

Diese Arbeit wird nicht bauen, wenn Sie mehr als eine Seite haben. Wenn Sie mehr als eine Seite haben, müssen Sie das OnStartPage-Ereignis anstelle des OnEndPage-Ereignisses verwenden.

1

Ich benutzte einen sehr einfachen Ansatz, um auf jeder Seite eine Kopfzeile einzufügen, wenn ein PdfPTable mit 'n' Zeilen erstellt wurde, wobei 'n' eine ganze Zahl sein konnte. Ich benutze iTextSharp 4.0.4.0.

So könnten Sie eine Tabelle mit 1000 Zeilen oder 2 Zeilen oder 5000 Zeilen erstellen, aber iTextSharp wird die Ausgabe automatisch für Sie paging. Was iTextSharp nicht tut, fügt automatisch eine Kopfzeile zum Anfang jeder Seite hinzu.

Um eine Kopfzeile für jede Seite hinzuzufügen, alles, was ich tat, war die einzige Zeile Code hinzufügen, nachdem die PdfPTable mit all ihren Reihen und Zellen zu schaffen und dann ausgelagert iTextSharp automatisch die Ausgabe mit einer Kopfzeile. 'table' ist die Instanz von PdfPTable, die ich in meinem Code erstellt habe, bevor ich die Eigenschaft HeaderRows gesetzt habe.

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. 
Verwandte Themen