Generación de PDF desde .NET usando formularios

Un post en .NET Answers me ha recordado que hace tiempo tenía pendiente escribir una entrada para comentar la técnica que he utilizado en más de una ocasión para generar documentos PDF desde mis aplicaciones .NET de forma muy sencilla, y que puede aplicarse en escenarios donde se conozca de antemano el diseño del documento a imprimir y sólo sea necesario introducir información concreta en espacios muy definidos. Un caso muy habitual es el rellenado de formularios o impresos, aunque usando un poco la imaginación seguro que podéis encontrarle muchas más utilidades.

La técnica consiste en crear, utilizando alguna herramienta de diseño como Adobe Acrobat, un documento PDF que contenga todos los contenidos estáticos del documento que deseamos generar. En cada zona donde queremos inyectar contenido deberemos introducir un campo de formulario (por ejemplo, “nombre”, “apellidos”, etc.) adaptando el tipo de letra, límites y las propiedades del campo que sean necesarias.

imageYa desde código el procedimiento será bien sencillo: abrimos la plantilla, introducimos los valores en cada uno de los campos, y hacemos con el documento resultante lo que nos convenga según la ocasión: enviarlo por email, salvarlo a disco, ofrecerlo para la descarga, etc.

Para conseguir estos objetivos utilizaremos iTextSharp, una adaptación para .NET de la librería iText, muy conocida en el mundo Java. Por tanto, en primer lugar, es necesario descargarla desde Sourceforge, y referenciarla en el proyecto desde el cual vamos a utilizarla.

El siguiente código implementa un método realiza el procedimiento descrito:

   1: public void FillPDF(string templateFile, Stream stream)
   2: {
   3:     // Abrimos la plantilla y creamos una copia, sobre
   4:     // la cual trabajaremos...
   5:     PdfReader reader = new PdfReader(templateFile);
   6:     PdfStamper stamp = new PdfStamper(reader, stream);
   7:  
   8:     // Introducimos el valor en los campos del formulario...
   9:     stamp.AcroFields.SetField("Nombre", "Juan");
  10:     stamp.AcroFields.SetField("Apellidos", "Rodríguez Méndez");
  11:  
  12:     // Fijamos los valores y enviamos el resultado al stream...
  13:     stamp.FormFlattening = true;
  14:     stamp.Close(); 
  15: }

Así, para almacenar la plantilla con los datos en un nuevo PDF, bastaría con invocar al método anterior de la siguiente manera:

   1: Stream file = new FileStream("FormularioRelleno.pdf", FileMode.Create);
   2: FillPDF("plantilla.pdf", file);

O si queremos que desde una aplicación ASP.NET el usuario pudiera descargarlo directamente, podríamos utilizar un código como el siguiente:

   1: protected void btnGenerarPDF_Click(object sender, EventArgs e)
   2: {
   3:     Response.Clear();
   4:     Response.ContentType = "application/pdf";
   5:     Response.AddHeader("content-disposition", "attachment;filename=Formulario.pdf");
   6:     FillPDF(Server.MapPath("Plantilla.pdf"), Response.OutputStream);
   7: }

Por último, sólo comentar que iTextSharp no sólo es útil para rellenar formularios, ni mucho menos. Se trata de una librería muy potente que permite la creación y edición al vuelo de documentos PDF completos, y dispone de un complejo amplísimo API que nos permite hacer casi de todo con ellos. Además, se distribuye bajo licencias LGPL y MPL, muy permisivas ambas, por lo que pueden ser utilizadas en prácticamente cualquier tipo de sistemas.

Para el que no se le apetezca teclear mucho, ahí va una solución para Visual Studio 2005 con dos proyectos, uno web y otro de consola, demostrando el funcionamiento.

 

 

Publicado en: Variable not found.

12 comentarios en “Generación de PDF desde .NET usando formularios”

  1. Hola!, ami me esta generando error al intentar abrirlo! :(, entonces hize uno desde 0, y cuando le paso como parámetros los nombres de mis cajas de texto me muestra el siguiente error:

    stamp.AcroFields.SetField(“Texto1”, txtcodigo.Text);
    stamp.AcroFields.SetField(“Texto2”, txttitulo.Text);

    [se requiere una referencia a objeto campo, metodo o propiedad, no estaticos … ]

    Nota: Antes añadi la libreria: iTextSharp, a que crees que se deba? 🙁

  2. Hola, gracias por comentar!

    @Jorge, si ese error te está apareciendo en tiempo de compilación es que hay algo que no encuentra… mira a ver si estás intentando acceder desde un método estático a propiedades de instancia o cosas así. Simplifica tu escenario (p.e., introduciendo constantes en el contenido de los campos, en vez de tomarlas de los textboxes), y seguro que lo echas a andar.

    @Ale, puedes crear esos marcos con Adobe Acrobat (hay una versión de evaluación de X días en su web), aunque supongo que habrá otros programas que también lo permitan. La relación con el código la haces a través de los identificadores que asignas a los controles de edición (en el ejemplo anterior, se llaman “Texto1”, y “Texto2”).

    Saludos.

  3. Hola estoy probando tu ejemplo pero tengo un dilema, tengo un componente que genera imagenes de codigo de barras que tengo que ponerle al pdf creado, pero no encuentro como, algun tip?

    las imagenes del codigo de barras se generan al vuelo y es diferente en cada caso

    saludos

  4. Hola a todos
    Me ha surgido un pequeño problema cuando desde vb.net con la librería iTextsharp relleno una plantilla de cajas de texto Pdf y es la siguiente.
    Cuando relleno por código una caja de texto multiline (con más de dos lineas) en el pdf resultante, solo me visualiza dos y no me deja con el cursor poder ir recorriendo el resto del contenido del mismo. ¿Alguno podría ayudarme)

  5. Hola, no se si este post sigue activo, pero tengo una duda.
    Estoy empezando con esto del itextsharp y mi problema es el siguiente:

    Quiero generar un PDF a partir de una plantilla ya creada con la estructura, formato, imagenes, etc, del documento. Se trata de un albaran o factura. He añadido un campo a la plantilla por cada dato que debo completar desde mi proyecto de c#, pero el problema lo tengo con la generacion de las lineas, no encuentro ningun tipo de campo tabla que me permita ir añadiendo tantas lineas como tenga el albaran e incluso que me genere el salto de pagina.

    Gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *