[C#, iTextSharp] PDF Header und Footer erstellen

Drucken
( 5 Votes )
Hauptkategorie: Programmieren Kategorie: C#
Erstellt am 06.06.2012 Zuletzt aktualisiert am 06.06.2012 Geschrieben von Jonny132
Die iTextSharp - Bibliothek zur Erstellung von PDF's bietet uns auch die Möglichkeit Header -und Footer Texte in einem PDF zu generieren. Somit haben alle generierten Seiten das selbe Design.
Oftmals gibt es die Anforderung dem PDF ein Logo als Header und das aktuelle Datum als Footer hinzuzufügen.

Um dies zu bewerkstelligen benötigen wir die Info, wenn ein Seitenende erreicht wurde.
Genau diese Information bietet die PdfPageEventHelper - Klasse welche uns diverse Events bereitstellen in der wir das aktuelle Document, bzw genäuer gesagt die aktuelle Seite noch bearbeiten können und somit Header und Footer einfügen können.

Damit wir die 'Signatur' jederzeit immer wieder verwenden können, erstellen wir eine neue Datei / Klasse 'PdfPageEvents', in der wir von der PdfPageEventHelper Klasse ableiten und das OnEndPage Ereignis überschreiben.

PdfPageEvents.cs:
    public class PdfPageEvents : PdfPageEventHelper
    {
        // ------------------------------------------------------------------------
        private float MilimetersToPoints(int mm)
        {
            return Utilities.MillimetersToPoints(Convert.ToSingle(mm));
        }

        // ------------------------------------------------------------------------
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);
            PdfContentByte m_Cb = writer.DirectContent;

            Rectangle pageSize = document.PageSize;

            // Header - Logo
            Image img = Image.GetInstance(@"C:\Temp\logo.png");
            img.SetAbsolutePosition(pageSize.GetRight(MilimetersToPoints(20)) - img.ScaledWidth + 10, pageSize.GetTop(MilimetersToPoints(10) + img.ScaledHeight));
            document.Add(img);

            // Footer Datum
            m_Cb.BeginText();
            m_Cb.SetFontAndSize(new Font(iTextSharp.text.Font.FontFamily.HELVETICA, 8, iTextSharp.text.Font.NORMAL).GetCalculatedBaseFont(false), 12);
            m_Cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT,
                DateTime.Now.ToString(),
                pageSize.GetRight(MilimetersToPoints(15)),
                pageSize.GetBottom(MilimetersToPoints(15)), 0);
            m_Cb.EndText();
        }
    }
In dieser Klasse erstellen wir zuerst wieder eine Hilfsfunktion, die uns übergebene Milimeter in interne Points umwandelt (MilimetersToPoints).
Im überschriebenen OnPageEnd - Ereignis rufen wir zuerst das OnEndPage der Vaterklasse auf.
Danach holen wir uns das PdfContentByte (stellt den direkten Content der Pdf - Datei dar) und die Seitengröße als Rectangle.

Per Image.GetInstance() erstellen wir ein Image - Objekt das unser Logo beinhaltet und setzten die Position des Logos (rechts Oben) und fügen es dem Dokument hinzu.

Mittels BeginText() teilen wir dem PdfContentByte mit, dass wir einen Text einfügen wollen. Dazu müssen wir das Font und die Größe setzen und ShowTextAligned() mit den gewollten Parametern aufrufen.
Mit EndText() wird die Bearbeitung des PdfContentByte 's wieder geschlossen.

Beispiel und Anwendung der erstellten Klasse PdfPageEvents:
          float margin = Utilities.MillimetersToPoints(Convert.ToSingle(20));
          Document doc = new Document(iTextSharp.text.PageSize.A4, margin, margin, margin * 2, margin);
          PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("C:\\Temp\\Test.pdf", FileMode.Create));
          writer.PageEvent = new PdfPageEvents();
          writer.SetFullCompression();
          writer.CloseStream = true;
          doc.Open();
          doc.NewPage();
          doc.Add(new Chunk("Seite 1"));
          doc.NewPage();
          doc.Add(new Chunk("Seite 2"));
          doc.NewPage();
          doc.Add(new Chunk("Seite 3"));
          doc.NewPage();
          doc.Add(new Chunk("Seite 4"));
          doc.NewPage();
          doc.Add(new Chunk("Seite 5"));
          if (doc != null)
          {
              doc.Close();
          } 
          doc = null;
          Process.Start("C:\\Temp\\Test.pdf");
Die Grundsätzliche erstellung von Pdf 's wurde bereits in [C#] Generieren / Erstellen von PDF 's mit iTextSharp erwähnt. Der einzige Unterschied den Sie bei diesem Codeschnipsel beachten müssen, ist das setzen des PageEvents, der wir eine Instanz unser eigens erstellte Klasse zuweisen.

iTextSharp Header und Footer erstellen 


    Veröffentlichen Sie ihre Kommentare ...