Generando PDF utilizando ItextSharp en C#

Introducción

Existen varios requerimientos para generar archivos en PDF, por ejemplo generar facturas en ese formato, hay varias opciones para generar documentos PDF. Por supuesto que la opción más simple es utilizar Crystal Reports además de tener una buena calidad, pero el problema con Crystal Reports es que es necesario instalarlo, y si es un proyecto web, se necesita instalar Crystal Reports en el servidor del hosting, de modo que encuentro en ItextSharp una alternativa interesante.

Después de investigar en varios artículos de internet para poder generar la factura tal como la esperaba un cliente, ya que la información para utilizar ItextSharp está en partes así que vamos a ver una forma más completa: como emitir un PDF con encabezado, cuerpo y pie de página.

Requerimientos

La librería iTextSharp está disponible gratuitamente y puede ser descarga desde aquí.

Utilizando el Código

Después de descargar iTextSharp , hay que agregar una referencia a la librería de ITextSharp en tu proyecto.

Utiliza el siguiente espacio de nombres antes de empezar a escribir código.

using iTextSharp.text.pdf;

using iTextSharp.text; 

El código sería el siguiente:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using iTextSharp.text.pdf;
using iTextSharp.text;
using System.IO;

namespace CrearPDF_iText
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnCrearPDF_Click(object sender, EventArgs e)
        {
            Document doc = new Document(iTextSharp.text.PageSize.A4);

            System.IO.FileStream file = new System.IO.FileStream(Application.StartupPath + "/" + DateTime.Now.ToString("ddMMyyHHmmss") + ".pdf", System.IO.FileMode.OpenOrCreate);

            PdfWriter writer = PdfWriter.GetInstance(doc, file);
            doc.Open();
            PdfPTable tab = new PdfPTable(3);
            PdfPCell cell = new PdfPCell(new Phrase("Encabezado", new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 24)));
            cell.Colspan = 3;
            cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right
            //Style
            cell.BorderColor = new BaseColor(System.Drawing.Color.Red);
            cell.Border = 1; // | Rectangle.TOP_BORDER;
            cell.BorderWidthBottom = 3f;
            tab.AddCell(cell);
            //row 1
            tab.AddCell("R1C1");
            tab.AddCell("R1C2");
            tab.AddCell("R1C3");
            //row 2
            tab.AddCell("R2C1");
            tab.AddCell("R2C2");
            tab.AddCell("R2C3");
            cell = new PdfPCell();
            cell.Colspan = 3;
            iTextSharp.text.List pdfList = new List(List.UNORDERED);
            pdfList.Add(new iTextSharp.text.ListItem(new Phrase("Producto de Lista 1")));
            pdfList.Add("Producto de Lista 2");
            pdfList.Add("Producto de Lista 3");
            pdfList.Add("Producto de Lista 4");
            cell.AddElement(pdfList);
            tab.AddCell(cell);
            doc.Add(tab);
            // calling PDFFooter class to Include in document
            writer.PageEvent = new PDFFooter();
            doc.Close();
            file.Close();
        }

      
    }

    public class PDFFooter : PdfPageEventHelper
    {
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            //base.OnEndPage(writer, document);
            // Writing Footer on Page
            PdfPTable tab = new PdfPTable(1);
            PdfPCell cell = new PdfPCell(new Phrase("Prueba de Pie de Página"));
            cell.Border = 0;
            tab.TotalWidth = 300F;
            tab.AddCell(cell);
            tab.WriteSelectedRows(0, -1, 300, 30, writer.DirectContent);
        }


    }
}

Puntos de Interés

El siguiente código es para crear un PDF a disco con la ayuda de la clase FileStream class, también puedes utilizar la clase MemoryStream para enviar el PDF como una respuesta.

System.IO.MemoryStream str = new System.IO.MemoryStream();

        PdfWriter writer = PdfWriter.GetInstance(doc, str);

        Response.AddHeader("Content-Disposition", "attachment;filename=report.pdf");

        Response.ContentType = "application/pdf";

        Response.BinaryWrite(str.ToArray());

        str.Close();

        Response.End();

0 comentarios: