2013-09-25 55 views
27

Come posso aggiungere intestazione e piè di pagina per ogni pagina nel pdf.Aggiungi intestazione e piè di pagina per PDF utilizzando iTextsharp

Headed conterrà solo un piè di pagina di testo conterrà un testo e impaginazione per PDF (Pagina: 1 di 4)

Come è possibile? Ho provato ad aggiungere la riga sottostante, ma l'intestazione non viene visualizzata in pdf.

document.AddHeader("Header", "Header Text"); 

Questo il codice che sto usando per PDF generazione:

protected void GeneratePDF_Click(object sender, EventArgs e) 
    { 
     DataTable dt = getData(); 

      Response.ContentType = "application/pdf"; 
      Response.AddHeader("content-disposition", "attachment;filename=Locations.pdf"); 
      Response.Cache.SetCacheability(HttpCacheability.NoCache); 

      Document document = new Document(); 

      PdfWriter.GetInstance(document, Response.OutputStream); 

      document.Open(); 

      iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.COURIER , 8); 

      PdfPTable table = new PdfPTable(dt.Columns.Count); 
      PdfPRow row = null; 
      float[] widths = new float[] { 6f, 6f, 2f, 4f, 2f }; 

      table.SetWidths(widths); 

      table.WidthPercentage = 100; 
      int iCol = 0; 
      string colname = ""; 
      PdfPCell cell = new PdfPCell(new Phrase("Locations")); 

      cell.Colspan = dt.Columns.Count; 

      foreach (DataColumn c in dt.Columns) 
      { 

       table.AddCell(new Phrase(c.ColumnName, font5)); 
      } 

      foreach (DataRow r in dt.Rows) 
      { 
       if (dt.Rows.Count > 0) 
       { 
        table.AddCell(new Phrase(r[0].ToString(), font5)); 
        table.AddCell(new Phrase(r[1].ToString(), font5)); 
        table.AddCell(new Phrase(r[2].ToString(), font5)); 
        table.AddCell(new Phrase(r[3].ToString(), font5)); 
        table.AddCell(new Phrase(r[4].ToString(), font5)); 
       } 
      } 
      document.Add(table); 
      document.Close(); 

      Response.Write(document); 
      Response.End(); 
     } 
    } 
+0

Potrebbe essere questo aiuto completo. http://www.mazsoft.com/blog/post/2008/04/30/Code-sample-for-using-iTextSharp-PDF-library.aspx –

risposta

6

Noi non parliamo di iTextSharp più. Stai usando iText 5 per .NET. La versione corrente è iText 7 per .NET.

risposta obsoleta:

Il AddHeader è stato deprecato da molto tempo ed è stato rimosso dal iTextSharp. L'aggiunta di intestazioni e piè di pagina ora viene eseguita utilizzando page events. Gli esempi sono in Java, ma è possibile trovare la porta C# degli esempi here e here (scorrere fino alla fine della pagina per i collegamenti ai file .cs).

Assicurarsi di leggere la documentazione. Un errore comune che molti sviluppatori hanno fatto prima di te, sta aggiungendo il contenuto nello OnStartPage. È necessario aggiungere solo contenuto nello OnEndPage. È anche ovvio che è necessario aggiungere il contenuto alle coordinate assolute (ad esempio utilizzando ColumnText) e che è necessario riservare spazio sufficiente per l'intestazione e il piè di pagina definendo correttamente i margini del documento.

risposta Aggiornato:

Se siete nuovi a iText, si dovrebbe usare iText 7 e utilizzare i gestori di eventi per aggiungere intestazioni e piè di pagina. Vedi chapter 3 dell'esercitazione Jump-Start di iText 7 per .NET.

Quando si ha un PdfDocument in iText 7, è possibile aggiungere un gestore di eventi:

PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler()); 

Questo è un esempio di nel modo più duro per aggiungere del testo in una posizione assoluta (utilizzando PdfCanvas):

protected internal class MyEventHandler : IEventHandler { 
    public virtual void HandleEvent(Event @event) { 
     PdfDocumentEvent docEvent = (PdfDocumentEvent)@event; 
     PdfDocument pdfDoc = docEvent.GetDocument(); 
     PdfPage page = docEvent.GetPage(); 
     int pageNumber = pdfDoc.GetPageNumber(page); 
     Rectangle pageSize = page.GetPageSize(); 
     PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc); 
     //Add header 
     pdfCanvas.BeginText() 
      .SetFontAndSize(C03E03_UFO.helvetica, 9) 
      .MoveText(pageSize.GetWidth()/2 - 60, pageSize.GetTop() - 20) 
      .ShowText("THE TRUTH IS OUT THERE") 
      .MoveText(60, -pageSize.GetTop() + 30) 
      .ShowText(pageNumber.ToString()) 
      .EndText(); 
     pdfCanvas.release(); 
    } 
} 

Questo è un modo di livello superiore leggermente, utilizzando Canvas:

protected internal class MyEventHandler : IEventHandler { 
    public virtual void HandleEvent(Event @event) { 
     PdfDocumentEvent docEvent = (PdfDocumentEvent)@event; 
     PdfDocument pdfDoc = docEvent.GetDocument(); 
     PdfPage page = docEvent.GetPage(); 
     int pageNumber = pdfDoc.GetPageNumber(page); 
     Rectangle pageSize = page.GetPageSize(); 
     PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc); 
     //Add watermark 
     Canvas canvas = new Canvas(pdfCanvas, pdfDoc, page.getPageSize()); 
     canvas.setFontColor(Color.WHITE); 
     canvas.setProperty(Property.FONT_SIZE, 60); 
     canvas.setProperty(Property.FONT, helveticaBold); 
     canvas.showTextAligned(new Paragraph("CONFIDENTIAL"), 
      298, 421, pdfDoc.getPageNumber(page), 
      TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); 
     pdfCanvas.release(); 
    } 
} 

Esistono altri modi per aggiungere contenuto nelle posizioni assolute. Sono descritti nei diversi iText books.

+0

Non completamente vero. L'utilizzo degli eventi di pagina è un modo per aggiungere intestazioni/piè di pagina, ma è possibile aggiungerli usando 'Document.Header' o' Document.Footer'. – Dom

+2

Caro Dom, se puoi aggiungere intestazioni e piè di pagina con 'Document.Header' o' Document.Footer', stai utilizzando una versione di iText che non è più supportata: http://lowagie.com/itext2 –

+0

Mi scuso ! Grazie per l'info! – Dom

32

Come già risposto da @Bruno è necessario utilizzare pageEvents.

Si prega di controllare il codice di esempio riportato di seguito:

private void CreatePDF() 
{ 
    string fileName = string.Empty;  
    DateTime fileCreationDatetime = DateTime.Now;  
    fileName = string.Format("{0}.pdf", fileCreationDatetime.ToString(@"yyyyMMdd") + "_" + fileCreationDatetime.ToString(@"HHmmss"));  
    string pdfPath = Server.MapPath(@"~\PDFs\") + fileName; 

    using (FileStream msReport = new FileStream(pdfPath, FileMode.Create)) 
    { 
     //step 1 
     using (Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 140f, 10f)) 
     { 
      try 
      { 
       // step 2 
       PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, msReport); 
       pdfWriter.PageEvent = new Common.ITextEvents(); 

       //open the stream 
       pdfDoc.Open(); 

       for (int i = 0; i < 10; i++) 
       { 
        Paragraph para = new Paragraph("Hello world. Checking Header Footer", new Font(Font.FontFamily.HELVETICA, 22));  
        para.Alignment = Element.ALIGN_CENTER;  
        pdfDoc.Add(para);  
        pdfDoc.NewPage(); 
       } 

       pdfDoc.Close();  
      } 
      catch (Exception ex) 
      { 
       //handle exception 
      }  
      finally 
      { 
      }  
     }  
    } 
} 

E creare un file di classe di nome ITextEvents.cs e aggiungere seguente codice:

public class ITextEvents : PdfPageEventHelper 
{  
    // This is the contentbyte object of the writer 
    PdfContentByte cb; 

    // we will put the final number of pages in a template 
    PdfTemplate headerTemplate, footerTemplate; 

    // this is the BaseFont we are going to use for the header/footer 
    BaseFont bf = null; 

    // This keeps track of the creation time 
    DateTime PrintTime = DateTime.Now;  

    #region Fields 
    private string _header; 
    #endregion 

    #region Properties 
    public string Header 
    { 
     get { return _header; } 
     set { _header = value; } 
    } 
    #endregion  

    public override void OnOpenDocument(PdfWriter writer, Document document) 
    { 
     try 
     { 
      PrintTime = DateTime.Now; 
      bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
      cb = writer.DirectContent; 
      headerTemplate = cb.CreateTemplate(100, 100); 
      footerTemplate = cb.CreateTemplate(50, 50); 
     } 
     catch (DocumentException de) 
     {  
     } 
     catch (System.IO.IOException ioe) 
     {  
     } 
    } 

    public override void OnEndPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document) 
    { 
     base.OnEndPage(writer, document);  
     iTextSharp.text.Font baseFontNormal = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12f, iTextSharp.text.Font.NORMAL, iTextSharp.text.BaseColor.BLACK);  
     iTextSharp.text.Font baseFontBig = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12f, iTextSharp.text.Font.BOLD, iTextSharp.text.BaseColor.BLACK);  
     Phrase p1Header = new Phrase("Sample Header Here", baseFontNormal); 

     //Create PdfTable object 
     PdfPTable pdfTab = new PdfPTable(3); 

     //We will have to create separate cells to include image logo and 2 separate strings 
     //Row 1 
     PdfPCell pdfCell1 = new PdfPCell(); 
     PdfPCell pdfCell2 = new PdfPCell(p1Header); 
     PdfPCell pdfCell3 = new PdfPCell(); 
     String text = "Page " + writer.PageNumber + " of ";  

     //Add paging to header 
     { 
      cb.BeginText(); 
      cb.SetFontAndSize(bf, 12); 
      cb.SetTextMatrix(document.PageSize.GetRight(200), document.PageSize.GetTop(45)); 
      cb.ShowText(text); 
      cb.EndText(); 
      float len = bf.GetWidthPoint(text, 12); 
      //Adds "12" in Page 1 of 12 
      cb.AddTemplate(headerTemplate, document.PageSize.GetRight(200) + len, document.PageSize.GetTop(45)); 
     } 
     //Add paging to footer 
     { 
      cb.BeginText(); 
      cb.SetFontAndSize(bf, 12); 
      cb.SetTextMatrix(document.PageSize.GetRight(180), document.PageSize.GetBottom(30)); 
      cb.ShowText(text); 
      cb.EndText(); 
      float len = bf.GetWidthPoint(text, 12); 
      cb.AddTemplate(footerTemplate, document.PageSize.GetRight(180) + len, document.PageSize.GetBottom(30)); 
     } 

     //Row 2 
     PdfPCell pdfCell4 = new PdfPCell(new Phrase("Sub Header Description", baseFontNormal)); 

     //Row 3 
     PdfPCell pdfCell5 = new PdfPCell(new Phrase("Date:" + PrintTime.ToShortDateString(), baseFontBig)); 
     PdfPCell pdfCell6 = new PdfPCell(); 
     PdfPCell pdfCell7 = new PdfPCell(new Phrase("TIME:" + string.Format("{0:t}", DateTime.Now), baseFontBig));  

     //set the alignment of all three cells and set border to 0 
     pdfCell1.HorizontalAlignment = Element.ALIGN_CENTER; 
     pdfCell2.HorizontalAlignment = Element.ALIGN_CENTER; 
     pdfCell3.HorizontalAlignment = Element.ALIGN_CENTER; 
     pdfCell4.HorizontalAlignment = Element.ALIGN_CENTER; 
     pdfCell5.HorizontalAlignment = Element.ALIGN_CENTER; 
     pdfCell6.HorizontalAlignment = Element.ALIGN_CENTER; 
     pdfCell7.HorizontalAlignment = Element.ALIGN_CENTER;  

     pdfCell2.VerticalAlignment = Element.ALIGN_BOTTOM; 
     pdfCell3.VerticalAlignment = Element.ALIGN_MIDDLE; 
     pdfCell4.VerticalAlignment = Element.ALIGN_TOP; 
     pdfCell5.VerticalAlignment = Element.ALIGN_MIDDLE; 
     pdfCell6.VerticalAlignment = Element.ALIGN_MIDDLE; 
     pdfCell7.VerticalAlignment = Element.ALIGN_MIDDLE;  

     pdfCell4.Colspan = 3; 

     pdfCell1.Border = 0; 
     pdfCell2.Border = 0; 
     pdfCell3.Border = 0; 
     pdfCell4.Border = 0; 
     pdfCell5.Border = 0; 
     pdfCell6.Border = 0; 
     pdfCell7.Border = 0;  

     //add all three cells into PdfTable 
     pdfTab.AddCell(pdfCell1); 
     pdfTab.AddCell(pdfCell2); 
     pdfTab.AddCell(pdfCell3); 
     pdfTab.AddCell(pdfCell4); 
     pdfTab.AddCell(pdfCell5); 
     pdfTab.AddCell(pdfCell6); 
     pdfTab.AddCell(pdfCell7); 

     pdfTab.TotalWidth = document.PageSize.Width - 80f; 
     pdfTab.WidthPercentage = 70; 
     //pdfTab.HorizontalAlignment = Element.ALIGN_CENTER;  

     //call WriteSelectedRows of PdfTable. This writes rows from PdfWriter in PdfTable 
     //first param is start row. -1 indicates there is no end row and all the rows to be included to write 
     //Third and fourth param is x and y position to start writing 
     pdfTab.WriteSelectedRows(0, -1, 40, document.PageSize.Height - 30, writer.DirectContent); 
     //set pdfContent value 

     //Move the pointer and draw line to separate header section from rest of page 
     cb.MoveTo(40, document.PageSize.Height - 100); 
     cb.LineTo(document.PageSize.Width - 40, document.PageSize.Height - 100); 
     cb.Stroke(); 

     //Move the pointer and draw line to separate footer section from rest of page 
     cb.MoveTo(40, document.PageSize.GetBottom(50)); 
     cb.LineTo(document.PageSize.Width - 40, document.PageSize.GetBottom(50)); 
     cb.Stroke(); 
    } 

    public override void OnCloseDocument(PdfWriter writer, Document document) 
    { 
     base.OnCloseDocument(writer, document); 

     headerTemplate.BeginText(); 
     headerTemplate.SetFontAndSize(bf, 12); 
     headerTemplate.SetTextMatrix(0, 0); 
     headerTemplate.ShowText((writer.PageNumber - 1).ToString()); 
     headerTemplate.EndText(); 

     footerTemplate.BeginText(); 
     footerTemplate.SetFontAndSize(bf, 12); 
     footerTemplate.SetTextMatrix(0, 0); 
     footerTemplate.ShowText((writer.PageNumber - 1).ToString()); 
     footerTemplate.EndText(); 
    } 
} 

Spero che aiuta! codici

+0

Mi piace questo esempio, ma ho una domanda: se uso la classe PdfPageEventHelper come una classe comune per tutti i miei documenti PDF e voglio visualizzare un testo diverso nell'intestazione di ciascun documento (ad esempio come titolo del documento ... ecc. come faccio a impostarlo? Grazie. – user2430797

+0

È possibile creare proprietà per ogni elemento che deve essere impostato dinamicamente dall'utente. Ad esempio "Esempio di intestazione qui", potrebbe essere sostituito con la proprietà e il suo valore potrebbe essere impostato in fase di esecuzione. Spero che abbia senso. –

+0

Funzionando perfettamente !! Hai bisogno di aiuto per rimuovere il TotalCount in aggiunta al testo del piè di pagina mentre sto posizionando testo diverso nel piè di pagina. Il conteggio delle pagine sarà appeso a qualsiasi stringa che sto ponendo – Bhat

0

facile che lavorare con successo:

protected void Page_Load(object sender, EventArgs e) 
{ 
. 
.  
using (MemoryStream ms = new MemoryStream()) 
{ 
    . 
    . 
    iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 36, 36, 54, 54); 
    iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, ms); 
    writer.PageEvent = new HeaderFooter(); 
    doc.Open(); 
    . 
    . 
    // make your document content.. 
    . 
    .     
    doc.Close(); 
    writer.Close(); 

    // output 
    Response.ContentType = "application/pdf;"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=clientfilename.pdf"); 
    byte[] pdf = ms.ToArray(); 
    Response.OutputStream.Write(pdf, 0, pdf.Length); 
} 
. 
. 
. 
} 
class HeaderFooter : PdfPageEventHelper 
{ 
public override void OnEndPage(PdfWriter writer, Document document) 
{ 

    // Make your table header using PdfPTable and name that tblHeader 
    . 
    . 
    tblHeader.WriteSelectedRows(0, -1, page.Left + document.LeftMargin, page.Top, writer.DirectContent); 
    . 
    . 
    // Make your table footer using PdfPTable and name that tblFooter 
    . 
    . 
    tblFooter.WriteSelectedRows(0, -1, page.Left + document.LeftMargin, writer.PageSize.GetBottom(document.BottomMargin), writer.DirectContent); 
} 
} 
2

Basta aggiungere questa riga prima di aprire il documento (deve essere prima):

 document.Header = new HeaderFooter(new Phrase("Header Text"), false); 
     document.Open(); 
+0

Ciao Alvaro, benvenuto su StackOverflow. Puoi spiegare * perché * devi farlo, o * come * funziona? –

+1

Ciao, deve essere prima di aprire il documento se vuoi che l'intestazione sia mostrata sulla prima pagina, se non ne hai bisogno, puoi metterla dopo. So che il nuovo modo di farlo è attraverso PdfPageEvent, ma questo è un modo semplice se non hai bisogno di tanto controllo sull'intestazione o sul piè di pagina. Come funziona ... non c'è molta documentazione a riguardo. –

+0

Aha. Molte grazie per averlo spiegato - Sono fiducioso che le informazioni extra aiuteranno gli altri. –

5

Le risposte a questa domanda, mentre sono corrette, sono molto inutilmente complicato. Non richiede molto codice per mostrare il testo nell'intestazione/nel piè di pagina. Ecco un semplice esempio di aggiunta di testo all'intestazione/piè di pagina.

La versione corrente di iTextSharp funziona implementando una classe di callback definita dall'interfaccia IPdfPageEvent. Da quello che ho capito, non è una buona idea aggiungere le cose durante il metodo OnStartPage, così invece mi verrà utilizzato il metodo OnEndPage pagina. Gli eventi vengono attivati ​​in base a ciò che sta accadendo allo PdfWriter

Innanzitutto, creare una classe che implementa IPdfPageEvent. In: funzione di

 public void OnEndPage(PdfWriter writer, Document document) 

, ottenere l'oggetto PdfContentByte chiamando

 PdfContentByte cb = writer.DirectContent; 

Ora è possibile aggiungere testo molto facilmente:

  ColumnText ct = new ColumnText(cb); 

      cb.BeginText(); 
      cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12.0f); 
      //Note, (0,0) in this case is at the bottom of the document 
      cb.SetTextMatrix(document.LeftMargin, document.BottomMargin); 
      cb.ShowText(String.Format("{0} {1}", "Testing Text", "Like this")); 
      cb.EndText(); 

Così il pieno per la funzione OnEndPage sarà:

 public void OnEndPage(PdfWriter writer, Document document) 
     { 
      PdfContentByte cb = writer.DirectContent; 
      ColumnText ct = new ColumnText(cb); 

      cb.BeginText(); 
      cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12.0f); 
      cb.SetTextMatrix(document.LeftMargin, document.BottomMargin); 
      cb.ShowText(String.Format("{0} {1}", "Testing Text", "Like this")); 
      cb.EndText(); 

     } 

questo apparirà nella parte inferiore del documento. Un'ultima cosa. Non dimenticare di assegnare il IPdfPageEvent in questo modo:

 writter.PageEvent = new PDFEvents(); 

Per l'oggetto PdfWriter writter

Per la intestazione è molto simile. Basta capovolgere il SetTextMatrix coordinata y:

 cb.SetTextMatrix(document.LeftMargin, document.PageSize.Height - document.TopMargin); 
+1

La soluzione senza tabelle è più semplice delle altre. Lol è pazzo di quello che dobbiamo fare per aggiungere un semplice piede e intestazione. –

1

Per iTextSharp 4.1.6, l'ultima versione di iTextSharp che è stato concesso in licenza come LGPL, la soluzione fornita da Alvaro Patiño è semplice ed efficace.

Poiché la documentazione è un po 'scarsa mi piacerebbe estendere la sua risposta a questo frammento di codice che può essere utilizzato per modificare l'aspetto della intestazione e piè di pagina. Di default hanno una dimensione del carattere piuttosto grande e un bordo spesso, che molte persone vorranno cambiare.

// Parameters passed on to the function that creates the PDF 
String headerText = "Your header text"; 
String footerText = "Page"; 

// Define a font and font-size in points (plus f for float) and pick a color 
// This one is for both header and footer but you can also create seperate ones 
Font fontHeaderFooter = FontFactory.GetFont("arial", 8f); 
fontHeaderFooter.Color = Color.GRAY; 

// Apply the font to the headerText and create a Phrase with the result 
Chunk chkHeader = new Chunk(headerText, fontHeaderFooter); 
Phrase p1 = new Phrase(chkHeader); 

// create a HeaderFooter element for the header using the Phrase 
// The boolean turns numbering on or off 
HeaderFooter header = new HeaderFooter(p1, false); 

// Remove the border that is set by default 
header.Border = Rectangle.NO_BORDER; 
// Align the text: 0 is left, 1 center and 2 right. 
header.Alignment = 1; 

// add the header to the document 
document.Header = header; 

// The footer is created in an similar way 

// If you want to use numbering like in this example, add a whitespace to the 
// text because by default there's no space in between them 
if (footerText.Substring(footerText.Length - 1) != " ") footerText += " "; 

Chunk chkFooter = new Chunk(footerText, fontHeaderFooter); 
Phrase p2 = new Phrase(chkFooter); 

// Turn on numbering by setting the boolean to true 
HeaderFooter footer = new HeaderFooter(p2, true); 
footer.Border = Rectangle.NO_BORDER; 
footer.Alignment = 1; 

document.Footer = footer; 

// Open the Document for writing and continue creating its content 
document.Open(); 

Per maggiori informazioni controllare Creating PDFs with iTextSharp e iTextSharp - Adding Text with Chunks, Phrases and Paragraphs. Il codice sorgente su GitHub può anche essere utile.

0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using iTextSharp; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 
using DataLayer; 

namespace DataMngt.MyCode 
{ 
    public class HeaderFooter : PdfPageEventHelper 
    { 
     #region Startup_Stuff 

     private string[] _headerLines; 
     private string _footerLine; 

     private DefineFont _boldFont; 
     private DefineFont _normalFont; 

     private iTextSharp.text.Font fontTxtBold; 
     private iTextSharp.text.Font fontTxtRegular; 

     private int _fontPointSize = 0; 

     private bool hasFooter = false; 
     private bool hasHeader = false; 

     private int _headerWidth = 0; 
     private int _headerHeight = 0; 

     private int _footerWidth = 0; 
     private int _footerHeight = 0; 

     private int _leftMargin = 0; 
     private int _rightMargin = 0; 
     private int _topMargin = 0; 
     private int _bottomMargin = 0; 

     private PageNumbers NumberSettings; 

     private DateTime runTime = DateTime.Now;    

     public enum PageNumbers 
     { 
      None, 
      HeaderPlacement, 
      FooterPlacement 
     } 

     // This is the contentbyte object of the writer 
     PdfContentByte cb; 

     PdfTemplate headerTemplate; 
     PdfTemplate footerTemplate; 

     public string[] headerLines 
     { 
      get 
      { 
       return _headerLines; 
      } 
      set 
      { 
       _headerLines = value; 
       hasHeader = true; 
      } 
     } 

     public string footerLine 
     { 
      get 
      { 
       return _footerLine; 
      } 
      set 
      { 
       _footerLine = value; 
       hasFooter = true; 
      } 
     } 

     public DefineFont boldFont 
     { 
      get 
      { 
       return _boldFont; 
      } 
      set 
      { 
       _boldFont = value; 
      } 
     } 

     public DefineFont normalFont 
     { 
      get 
      { 
       return _normalFont; 
      } 
      set 
      { 
       _normalFont = value; 
      } 
     } 

     public int fontPointSize 
     { 
      get 
      { 
       return _fontPointSize; 
      } 
      set 
      { 
       _fontPointSize = value; 
      } 
     } 

     public int leftMargin 
     { 
      get 
      { 
       return _leftMargin; 
      } 
      set 
      { 
       _leftMargin = value; 
      } 
     } 

     public int rightMargin 
     { 
      get 
      { 
       return _rightMargin; 
      } 
      set 
      { 
       _rightMargin = value; 
      } 
     } 

     public int topMargin 
     { 
      get 
      { 
       return _topMargin; 
      } 
      set 
      { 
       _topMargin = value; 
      } 
     } 

     public int bottomMargin 
     { 
      get 
      { 
       return _bottomMargin; 
      } 
      set 
      { 
       _bottomMargin = value; 
      } 
     } 

     public int headerheight 
     { 
      get 
      { 
       return _headerHeight; 
      } 
     } 

     public int footerHeight 
     { 
      get 
      { 
       return _footerHeight; 
      } 
     } 

     public PageNumbers PageNumberSettings 
     { 
      get 
      { 
       return NumberSettings; 
      } 

      set 
      { 
       NumberSettings = value; 
      } 
     } 

     #endregion 

     #region Write_Headers_Footers 

     public override void OnEndPage(PdfWriter writer, Document document) 
     { 
      if (hasHeader) 
      { 
       // left side is the string array passed in 
       // right side is a built in string array (0 = date, 1 = time, 2(optional) = page) 
       float[] widths = new float[2] { 90f, 10f }; 

       PdfPTable hdrTable = new PdfPTable(2); 
       hdrTable.TotalWidth = document.PageSize.Width - (_leftMargin + _rightMargin); 
       hdrTable.WidthPercentage = 95; 
       hdrTable.SetWidths(widths); 
       hdrTable.LockedWidth = true; 

       for (int hdrIdx = 0; hdrIdx < (_headerLines.Length < 2 ? 2 : _headerLines.Length); hdrIdx ++) 
       { 
        string leftLine = (hdrIdx < _headerLines.Length ? _headerLines[hdrIdx] : string.Empty); 

        Paragraph leftPara = new Paragraph(5, leftLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular)); 

        switch (hdrIdx) 
        { 
         case 0: 
          { 
           leftPara.Font.Size = _fontPointSize; 

           PdfPCell leftCell = new PdfPCell(leftPara); 
           leftCell.HorizontalAlignment = Element.ALIGN_LEFT; 
           leftCell.Border = 0; 

           string rightLine = string.Format(SalesPlanResources.datePara, runTime.ToString(SalesPlanResources.datePrintMask)); 
           Paragraph rightPara = new Paragraph(5, rightLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular)); 
           rightPara.Font.Size = _fontPointSize; 

           PdfPCell rightCell = new PdfPCell(rightPara); 
           rightCell.HorizontalAlignment = Element.ALIGN_LEFT; 
           rightCell.Border = 0; 

           hdrTable.AddCell(leftCell); 
           hdrTable.AddCell(rightCell); 

           break; 
          } 

         case 1: 
          { 
           leftPara.Font.Size = _fontPointSize; 

           PdfPCell leftCell = new PdfPCell(leftPara); 
           leftCell.HorizontalAlignment = Element.ALIGN_LEFT; 
           leftCell.Border = 0; 

           string rightLine = string.Format(SalesPlanResources.timePara, runTime.ToString(SalesPlanResources.timePrintMask)); 
           Paragraph rightPara = new Paragraph(5, rightLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular)); 
           rightPara.Font.Size = _fontPointSize; 

           PdfPCell rightCell = new PdfPCell(rightPara); 
           rightCell.HorizontalAlignment = Element.ALIGN_LEFT; 
           rightCell.Border = 0; 

           hdrTable.AddCell(leftCell); 
           hdrTable.AddCell(rightCell); 

           break; 
          } 

         case 2: 
          { 
           leftPara.Font.Size = _fontPointSize; 

           PdfPCell leftCell = new PdfPCell(leftPara); 
           leftCell.HorizontalAlignment = Element.ALIGN_LEFT; 
           leftCell.Border = 0; 

           string rightLine; 
           if (NumberSettings == PageNumbers.HeaderPlacement) 
           { 
            rightLine = string.Concat(SalesPlanResources.pagePara, writer.PageNumber.ToString()); 
           } 
           else 
           { 
            rightLine = string.Empty; 
           } 
           Paragraph rightPara = new Paragraph(5, rightLine, fontTxtRegular); 
           rightPara.Font.Size = _fontPointSize; 

           PdfPCell rightCell = new PdfPCell(rightPara); 
           rightCell.HorizontalAlignment = Element.ALIGN_LEFT; 
           rightCell.Border = 0; 

           hdrTable.AddCell(leftCell); 
           hdrTable.AddCell(rightCell); 

           break; 
          } 

         default: 
          { 
           leftPara.Font.Size = _fontPointSize; 

           PdfPCell leftCell = new PdfPCell(leftPara); 
           leftCell.HorizontalAlignment = Element.ALIGN_LEFT; 
           leftCell.Border = 0; 
           leftCell.Colspan = 2;        

           hdrTable.AddCell(leftCell); 

           break; 
          } 
        } 
       } 

       hdrTable.WriteSelectedRows(0, -1, _leftMargin, document.PageSize.Height - _topMargin, writer.DirectContent); 

       //Move the pointer and draw line to separate header section from rest of page 
       cb.MoveTo(_leftMargin, document.Top + 10); 
       cb.LineTo(document.PageSize.Width - _leftMargin, document.Top + 10); 
       cb.Stroke(); 
      } 

      if (hasFooter) 
      { 
       // footer line is the width of the page so it is centered horizontally 
       PdfPTable ftrTable = new PdfPTable(1); 
       float[] widths = new float[1] {100 }; 

       ftrTable.TotalWidth = document.PageSize.Width - 10; 
       ftrTable.WidthPercentage = 95; 
       ftrTable.SetWidths(widths); 

       string OneLine; 

       if (NumberSettings == PageNumbers.FooterPlacement) 
       { 
        OneLine = string.Concat(_footerLine, writer.PageNumber.ToString()); 
       } 
       else 
       { 
        OneLine = _footerLine; 
       } 

       Paragraph onePara = new Paragraph(0, OneLine, fontTxtRegular); 
       onePara.Font.Size = _fontPointSize; 

       PdfPCell oneCell = new PdfPCell(onePara); 
       oneCell.HorizontalAlignment = Element.ALIGN_CENTER; 
       oneCell.Border = 0; 
       ftrTable.AddCell(oneCell); 

       ftrTable.WriteSelectedRows(0, -1, _leftMargin, (_footerHeight), writer.DirectContent); 

       //Move the pointer and draw line to separate footer section from rest of page 
       cb.MoveTo(_leftMargin, document.PageSize.GetBottom(_footerHeight + 2)); 
       cb.LineTo(document.PageSize.Width - _leftMargin, document.PageSize.GetBottom(_footerHeight + 2)); 
       cb.Stroke(); 
      } 
     } 

     #endregion 


     #region Setup_Headers_Footers_Happens_here 

     public override void OnOpenDocument(PdfWriter writer, Document document) 
     { 
      // create the fonts that are to be used 
      // first the hightlight or Bold font 
      fontTxtBold = FontFactory.GetFont(_boldFont.fontFamily, _boldFont.fontSize, _boldFont.foreColor); 
      if (_boldFont.isBold) 
      { 
       fontTxtBold.SetStyle(Font.BOLD); 
      } 
      if (_boldFont.isItalic) 
      { 
       fontTxtBold.SetStyle(Font.ITALIC); 
      } 
      if (_boldFont.isUnderlined) 
      { 
       fontTxtBold.SetStyle(Font.UNDERLINE); 
      } 

      // next the normal font 
      fontTxtRegular = FontFactory.GetFont(_normalFont.fontFamily, _normalFont.fontSize, _normalFont.foreColor); 
      if (_normalFont.isBold) 
      { 
       fontTxtRegular.SetStyle(Font.BOLD); 
      } 
      if (_normalFont.isItalic) 
      { 
       fontTxtRegular.SetStyle(Font.ITALIC); 
      } 
      if (_normalFont.isUnderlined) 
      { 
       fontTxtRegular.SetStyle(Font.UNDERLINE); 
      } 

      // now build the header and footer templates 
      try 
      { 
       float pageHeight = document.PageSize.Height; 
       float pageWidth = document.PageSize.Width; 

       _headerWidth = (int)pageWidth - ((int)_rightMargin + (int)_leftMargin); 
       _footerWidth = _headerWidth; 

       if (hasHeader) 
       { 
        // i basically dummy build the headers so i can trial fit them and see how much space they take. 
        float[] widths = new float[1] { 90f }; 

        PdfPTable hdrTable = new PdfPTable(1); 
        hdrTable.TotalWidth = document.PageSize.Width - (_leftMargin + _rightMargin); 
        hdrTable.WidthPercentage = 95; 
        hdrTable.SetWidths(widths); 
        hdrTable.LockedWidth = true; 

        _headerHeight = 0; 

        for (int hdrIdx = 0; hdrIdx < (_headerLines.Length < 2 ? 2 : _headerLines.Length); hdrIdx++) 
        { 
         Paragraph hdrPara = new Paragraph(5, hdrIdx > _headerLines.Length - 1 ? string.Empty : _headerLines[hdrIdx], (hdrIdx > 0 ? fontTxtRegular : fontTxtBold)); 
         PdfPCell hdrCell = new PdfPCell(hdrPara); 
         hdrCell.HorizontalAlignment = Element.ALIGN_LEFT; 
         hdrCell.Border = 0; 
         hdrTable.AddCell(hdrCell); 
         _headerHeight = _headerHeight + (int)hdrTable.GetRowHeight(hdrIdx); 
        } 

        // iTextSharp underestimates the size of each line so fudge it a little 
        // this gives me 3 extra lines to play with on the spacing 
        _headerHeight = _headerHeight + (_fontPointSize * 3); 

       } 

       if (hasFooter) 
       { 
        _footerHeight = (_fontPointSize * 2); 
       } 

       document.SetMargins(_leftMargin, _rightMargin, (_topMargin + _headerHeight), _footerHeight); 

       cb = writer.DirectContent; 

       if (hasHeader) 
       { 
        headerTemplate = cb.CreateTemplate(_headerWidth, _headerHeight); 
       } 

       if (hasFooter) 
       { 
        footerTemplate = cb.CreateTemplate(_footerWidth, _footerHeight); 
       } 
      } 
      catch (DocumentException de) 
      { 

      } 
      catch (System.IO.IOException ioe) 
      { 

      } 
     } 

     #endregion 

     #region Cleanup_Doc_Processing 

     public override void OnCloseDocument(PdfWriter writer, Document document) 
     { 
      base.OnCloseDocument(writer, document); 

      if (hasHeader) 
      { 
       headerTemplate.BeginText(); 
       headerTemplate.SetTextMatrix(0, 0); 

       if (NumberSettings == PageNumbers.HeaderPlacement) 
       { 
       } 

       headerTemplate.EndText(); 
      } 

      if (hasFooter) 
      { 
       footerTemplate.BeginText(); 
       footerTemplate.SetTextMatrix(0, 0); 

       if (NumberSettings == PageNumbers.FooterPlacement) 
       { 
       } 

       footerTemplate.EndText(); 
      } 
     } 

     #endregion 

    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using iTextSharp; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 

namespace DataMngt.MyCode 
{ 

    // used to define the fonts passed into the header and footer class 
    public struct DefineFont 
    { 
     public string fontFamily { get; set; } 
     public int fontSize { get; set; } 
     public bool isBold { get; set; } 
     public bool isItalic { get; set; } 
     public bool isUnderlined { get; set; } 
     public BaseColor foreColor { get; set; } 
    } 
} 

utilizzare:

Document pdfDoc = new Document(PageSize.LEGAL.Rotate(), 10, 10, 25, 25); 
System.IO.MemoryStream mStream = new System.IO.MemoryStream(); 
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, mStream); 
MyCode.HeaderFooter headers = new MyCode.HeaderFooter(); 
writer.PageEvent = headers; 

.. .. costruire l'array di stringhe per le intestazioni ...

DefineFont passFont = new DefineFont(); 

    // always set this to the largest font used 
    headers.fontPointSize = 8; 

    // set up the highlight or bold font 
    passFont.fontFamily = "Helvetica"; 
    passFont.fontSize = 8; 
    passFont.isBold = true; 
    passFont.isItalic = false; 
    passFont.isUnderlined = false; 
    passFont.foreColor = BaseColor.BLACK; 

    headers.boldFont = passFont; 

    // now setup the normal text font 
    passFont.fontSize = 7; 
    passFont.isBold = false; 

    headers.normalFont = passFont; 

    headers.leftMargin = 10; 
    headers.bottomMargin = 25; 
    headers.rightMargin = 10; 
    headers.topMargin = 25; 

    headers.PageNumberSettings = HeaderFooter.PageNumbers.FooterPlacement; 

    headers.footerLine = "Page"; 
    headers.headerLines = parmLines.ToArray(); 

    pdfDoc.SetMargins(headers.leftMargin, headers.rightMargin, headers.topMargin + headers.headerheight, headers.bottomMargin + headers.footerHeight); 
    pdfDoc.Open(); 

    // the new page is necessary due to a bug in in the current version of itextsharp 
    pdfDoc.NewPage(); 

... ora le intestazioni e piè di pagina saranno essere gestito automaticamente

+0

Quale pensi che sia il vantaggio della tua soluzione in contrasto con quelli delle risposte esistenti? – mkl

+0

È una routine molto generica che utilizzo per generare intestazioni e piè di pagina per un sacco di report che non necessitano di un'intestazione dell'immagine. È facilmente adattabile con la maggior parte degli usi che richiedono solo un cambiamento delle proprietà. – Woody

+0

Potresti voler modificare la tua risposta per spiegare che poiché c'è così tanto codice quasi nessuno leggerà tutto e scoprirà i vantaggi. – mkl

Problemi correlati