Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Otra vez de vuelta con iTextsharp y es que esta libería no deja de sorprenderme. Esta vez necesitaba rellenar un formulario creado con Adobe Acrobat con los datos de un formulario ASP.NET y me puse manos a la obra para crear algo que automatizase esta tarea. Para automatizar esta tarea tenemos que tener en cuenta lo siguiente:

Los campos Textfield del formulario Adobe y los campos TextBox del formulario ASP.NET deben llamarse de igual manera

Es decir, si en Adobe el campo se llama txtValor en ASP.NET será txtValor.

Una vez dicho esto os presento a la función que realiza este proceso:

private void FillPDF(string formName, string pathPDF)
{
    MemoryStream _MemoryStream = new MemoryStream();
    PdfReader reader = new PdfReader(pathPDF);
    PdfStamper stamper = new PdfStamper(reader, _MemoryStream);

    foreach (Control c in this.FindControl(formName).Controls)
    {
        if ((c is TextBox))
        {
            TextBox txt = (TextBox)c;
            foreach (string name in stamper.AcroFields.Fields.Keys)
            {
                if (name.EndsWith(c.ID + "[0]"))
                {
                    stamper.AcroFields.SetField(name, txt.Text);
                }
            }
        }
    }
    stamper.FormFlattening = true;
    stamper.Close();

    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ContentType = "application/pdf";
    HttpContext.Current.Response.AddHeader("Content-Disposition", "inline;filename=recibo.pdf");
    HttpContext.Current.Response.BinaryWrite(_MemoryStream.ToArray());
    HttpContext.Current.Response.End();
}


La función basicamento lo que hace es recorrer los controles del formulario ASP.NET y sólo se queda con los TextBox, busca su equivalente en el formulario PDF y cuando lo encuentra establece el valor.

Salu2 y espero que os resulte útil.
Published 4/11/2006 13:23 por Luis Ruiz Pavón
Archivado en: ,,
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2006/11/04/Rellenar-un-formulario-creado-con-Adobe-con-iTextSharp-desde-ASP.NET.aspx

Comentarios

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

buenisimo, gracias, ahora lo intentare con checkbox y te aviso si resulta

Saludos

Tuesday, January 09, 2007 9:38 PM por beño

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

La liga esta rota para

ver el demo y bajar el dodigo fuente

Friday, January 26, 2007 7:34 PM por Jcc

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Y se puede hacer con imagenes?

Wednesday, May 30, 2007 5:00 PM por GatoSka

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Pues no lo sé compañero ;)

Salu2

PD: A ver si encuentro el fuente y lo subo ;)

Tuesday, July 10, 2007 2:26 PM por Luis Ruiz Pavón

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Saludos,

En el caso de que no sepa los nombres de los textfield del pdf, y por consiguiente no sepa asignarle el mismo nombre al textbox del formularioweb. Hay alguna funcion que me de los nombres de los textfield del pdf?

Thursday, August 23, 2007 5:52 PM por pioner

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Hola pioner:

Pudes hacerlo con el bucle foreach que he puesto:

foreach (string name in

        stamper.AcroFields.Fields.Keys)

{

   Response.Write(name);

}

Salu2

Monday, August 27, 2007 12:51 PM por Luis Ruiz Pavón

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Gracias Luis por la ayuda, pude ver los textbox del formulario pdf que quiero, pero tengo problemas para llenar el formulario, le hice una modificación a tu función, ya que no quería que, solo para probar, no queria que me leyera todo el formulario, sino solo el textbox que necesitaba, y le pase el texto que necesito al formulario pdf.

Aqui está el código que estoy utilizando (esta en vb.net)

Dim MemoryStream As System.IO.MemoryStream = New System.IO.MemoryStream

       Dim Lector As PdfReader = New PdfReader(TextBox1.Text)

       Dim Stamper As PdfStamper = New PdfStamper(Lector, MemoryStream)

       Dim Control As Control = New Control

       Dim TextBox As TextBox = New TextBox

       Dim Nombre As String

       Try

           'For Each Control In Me.FindControl().Controls 'Formulario.FindControl("textbox").Controls

           '   If Control Is TextBox Then

           'Dim Texto As TextBox = Control

           For Each Nombre In Stamper.AcroFields.Fields.Keys

               If Nombre = Text1.ID Then

                   If Stamper.AcroFields.SetField(Nombre, text2.Text) = True Then

                       Exit For

                   End If

               End If

           Next

           '   End If

           ' Next

           Stamper.FormFlattening = True

           Stamper.Close()

           Response.ClearContent()

           Response.ClearHeaders()

           Response.ContentType = "application/pdf"

           Response.AddHeader("Content-Disposition", "inline;filename=recibo.pdf")

           Response.BinaryWrite(MemoryStream.ToArray)

           Response.Close()

       Catch ex As Exception

           Label1.Text = "Error: " & ex.Message

       End Try

No se porque (al debuguear el código), este lo recorre dos veces, y al terminar me dá un error en la página, Internet Explorer cannot display the webpage

Gracias

Wednesday, August 29, 2007 4:38 PM por pioner

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

También prove con la función que das, y me sigue dando el mismo error, Internet explorer no pudo mostrar la pagina web.

Wednesday, August 29, 2007 8:38 PM por pioner

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Hola, y ante todo gracias por la ayuda.Mi problema es el siguiente:

Tengo una aplicación la cual al pulsar un boton coge un pdf y rellena sus campos cogiendo estos de un documento xml, pero no hace nada.MI codigo es el siguiente:

String pathPDF = "C:\\prueba.pdf";

       MemoryStream _MemoryStream = new MemoryStream();

       PdfReader reader = new PdfReader(pathPDF);

       PdfStamper stamper = new PdfStamper(reader, _MemoryStream);

       String filename = "C:\\XMLFile1.xml";

       XmlDocument xmlDoc = new XmlDocument();

       xmlDoc.Load(filename);

       XmlNodeList xmlNodeList = xmlDoc.GetElementsByTagName("ns0:cliente");

       foreach (XmlElement xmlEl in xmlNodeList)

       {

           XmlNodeList xmlChildNodes = xmlEl.ChildNodes;

           foreach (XmlElement xmlChildEl in xmlChildNodes)

           {

               foreach (String name in stamper.AcroFields.Fields.Keys)

               {

                   stamper.AcroFields.SetField(name, xmlChildEl.Value);

                   if (name.Equals(xmlChildEl.Name))

                   {

                       stamper.AcroFields.SetField(name, xmlChildEl.Value);

                   }

               }

           }

       }

       stamper.FormFlattening = true;

       stamper.Close();

       HttpContext.Current.Response.ClearContent();

       HttpContext.Current.Response.ClearHeaders();

       HttpContext.Current.Response.ContentType = "application/pdf";

       HttpContext.Current.Response.AddHeader("Content-Disposition", "inline;filename=prueba.pdf");

       HttpContext.Current.Response.BinaryWrite(_MemoryStream.ToArray());

HttpContext.Current.Response.End();

Thursday, September 06, 2007 8:51 AM por javier

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Buenas,

Siguiendo este ejemplo tan bueno, necesito insertar imagenes en un pdf.

Alguien sabría ayudar a como hacerlo?

Muchas gracias de antemano.

Thursday, September 13, 2007 9:35 AM por monika

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Tienes problemas con las rutas, con tu mismo código he cambiado las rutas y funciona perfectamente, la unica cuestión, es como hacer que el PDF se pueda seguir editando... es decir tengo una base de datos, relleno los campos que tengo y luego cuando se abre el pdf, sigo editando los campos que me quedan.

Saludos. y Gracias

Friday, April 04, 2008 10:39 AM por Yernike

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

Hola. En respuesta a los que intentan trabajar con imagenes por lo que he podido observar, no se puede referenciar imágenes ya que no disponen de un id como lo tienen los elementos de formulario por lo que supongo no podremos cambiarlas a nuestro antojo (no al menos de este modo).

Un saludo a todos, muy interesante el articulo.

Wednesday, May 07, 2008 7:16 PM por Daniel Barbarin

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

A quienes desean trabajar con imágenes: probaron con el producto AspPdf ?

www.asppdf.com/manual_05.html

Slds

Friday, May 09, 2008 3:16 AM por Claudio

# re: Rellenar un formulario creado con Adobe con iTextSharp desde ASP.NET

necesito crear pdf con informacion de una base de datos como se hace porvaor es urgente gracias

Tuesday, July 01, 2008 9:13 PM por javier