2012-03-25 15 views
6

Ho aggiunto un'intestazione e un piè di pagina nel mio documento da PdfPageEventHelper.Intestazione, piè di pagina e tabelle di grandi dimensioni con iTextSharp

Il documento ha diverse tabelle "grandi" popolate in fase di esecuzione.

Ho provato ad aggiungere queste tabelle semplicemente con "documen.Add (table)", ma i miei risultati di intestazione e di footer sono stati sovrascritti.

ho già provato entrambi i metodi per aggiungere le tabelle (WriteSelectedRows e document.Add (myPdfPtable)

ecco il codice del 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); 
     } 

sulla mia pagina, ho semplicemente fare:

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. 

risposta

13

nel metodo OnEndPage avete questa linea:

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

Questo codice calcola correttamente la posizione in cui inserire il contenuto in base all'altezza e al margine superiore della pagina, ma include anche un magico 30, che provoca l'estrazione dell'intestazione sopra la tabella. Cambialo in questo e la tua intestazione andrà bene.

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

Sto indovinando che che 30 sta cercando di includere alcune riempimento tra l'intestazione e la tabella stessa. Quello che mi sento di raccomandare sta effettivamente cambiando i margini del documento se stessi nel codice principale:

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

E poi la contabilità per che nel metodo OnEndPage:

float cellHeight = document.TopMargin - 30; 

Il codice piè di pagina in realtà non tiene conto della margine inferiore e si limita a disegnare a 50 quindi questo si sovrapporrà sempre. La soluzione rapida sarebbe quella di cambiare per:

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

Questo almeno ottenere il piè di pagina in basso allineato. Se desideri un po 'più di padding come sopra, regola nuovamente i margini del documento:

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

Mi hai aiutato ancora una volta. Grazie Chris! : D –

Problemi correlati