2012-03-25 16 views
6

Ich habe einen Header und eine Fußzeile auf meinem Dokument von PdfPageEventHelper hinzugefügt.Kopfzeile, Fußzeile und große Tabellen mit iTextSharp

Das Dokument enthält zur Laufzeit mehrere "große" Tabellen.

Ich habe versucht, diese Tabellen einfach durch "documen.Add (Tabelle)" hinzuzufügen, aber meine Kopfzeile und meine Fußzeile Ergebnisse überschrieben.

Ich habe bereits versucht, beide Methoden die Tabellen (WriteSelectedRows und document.Add (myPdfPtable) hinzufügen

Hier ist der Code des PageEventHelper ist.

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

Auf meiner Seite, ich einfach tun:

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. 

Antwort

13

In Ihrer OnEndPage Methode, die Sie haben die folgende Zeile:

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

Dieser Code berechnet korrekt, wo Inhalte basierend auf der Höhe und dem oberen Rand der Seite platziert werden sollen, enthält aber auch eine magische 30, die dazu führt, dass der Header oben auf der Tabelle gezeichnet wird. Ändern Sie es zu diesem und Ihr Header wird in Ordnung sein.

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

Ich vermute, dass die 30 etwas Padding zwischen Ihrem Kopf und dem Tisch versucht, sich zu schließen. Was würde ich empfehlen, verändert sich tatsächlich der sich die Dokumentränder im Hauptcode:

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

Und dann für die Buchhaltung in der OnEndPage Methode:

float cellHeight = document.TopMargin - 30; 

Ihr Footer Code Konto nicht wirklich für die unteren Rand und zeichnet es einfach bei 50 so wird dies immer überlappen. Die schnelle Lösung wäre, es in:

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

Dies wird mindestens die Fußzeile unten ausgerichtet bekommen. Wenn Sie mehr Polsterung wie oben wollen, passen Sie einfach die Ränder des Dokuments wieder an:

+0

Sie haben mir wieder einmal geholfen. Danke Chris! : D –

Verwandte Themen