miércoles, 5 de febrero de 2014

Rellenar pdfs editables con .NET



Buenas en este post voy a continuar con el tema que empezamos en un post anterior de crear pdfs con .NET e iTextSharp.
¿Qué es lo que pasa si nuestro pdf es editable? Pues bien aquí hay una solución mejor que ir escribiendo líneas en el pdf en una determinada posición como si se tratara de una máquina de escribir, que es como lo hicimos en el post anterior.
Para ello sencillamente vamos ir asignado valores a los campos que tenemos ya creados en el pdf editable. ¿Pues cómo sé el nombre de los campos?
Hay 2 formas: la primera usando el Acrobat Profesional o similar. En el Acrobat Profesional vamos a ‘Herramientas’ – ‘Formularios’ – ‘Editar’

Y verás el nombre de los campos en lista que aparece en el lado derecho. Para cada campo si haces click con el botón derecho en ‘Propiedades’ puedes ver además del nombre, los valores permitidos para ese campo, cosa interesante a saber si trabajamos con Checkboxes, RadioButtons, etc. 


Otra forma es con el siguiente código, que esta vez sí está disponible para descargar aquí –no como el del anterior post que por no colgarlo en la nube desapareció al romperse un disco duro-.
  'Leer el nombre de los campos del pdf editable
        Dim pdfReader As New iTextSharp.text.pdf.PdfReader(ruta)
        Dim sb As New StringBuilder()
        For Each de As KeyValuePair(Of String, AcroFields.Item) In pdfReader.AcroFields.Fields
            sb.Append(de.Key.ToString() & vbNewLine)
        Next

        TextBoxDetails.Text = sb.ToString()
        TextBoxDetails.SelectionStart = TextBoxDetails.TextLength

Pues bien el proceso para escribir en pdfs editables en muy sencillo y he creado un formulario para enseñar a hacerlo. 
El punto de partida en el que me he basado para este ejemplo es el siguiente: imaginemos que somos una empresa con sede en Madrid y vamos a dar de alta un centro de trabajo en Navarra. Como sabemos en los artículos 19 y 33 del concierto económico con Navarra si nuestra cifra de negocios es inferior a los 7 M€ vamos a tributar y presentar las declaraciones de IVA y Sociedades en el lugar donde tengamos nuestro domicilio fiscal y supongo que es en Madrid. En Navarra sólo presentaremos retenciones -y el alta de IAE en Pamplona-. Pues bajo este supuesto real que puede ocurrir en cualquier empresa vamos a diseñar un formulario que me permita agilizar los pasos. Ya sé que en este caso no merecería la pena pero hay casos similares donde hay procesos repetitivos con formularios que se pueden agilizar, y mucho.
Pues bien diseñamos el formulario –veréis que falta el CIF y las validaciones y algunos campos identificativos más, pero he querido centrarme en el hecho de rellenar el pdf-.
 Al pulsar en el botón 'F65 Navarra' vamos a escribir el siguiente código:
'la variable ruta es la ruta  completa del fichero
        Dim pdfStamper As iTextSharp.text.pdf.PdfStamper = Nothing
        Try
            'Modelo IAE Ayuntamiento de Pamplona
            If Not ruta = String.Empty Then
                Dim pdfReader As New iTextSharp.text.pdf.PdfReader(ruta)
                'Modifico el nombre del pdf para no sobreescribir el original
                Dim rutafinal As String = Path.GetDirectoryName(ruta)
                Dim nombrefinal As String = Path.GetFileName(ruta).Insert(0, "PDF Modificado ")
                'Guardo el pdf relleno
                pdfStamper = New iTextSharp.text.pdf.PdfStamper(pdfReader, New FileStream(rutafinal & "\" & nombrefinal, FileMode.Create))

                Dim pdfFormFields As AcroFields = pdfStamper.AcroFields
                'Relleno los campos
                pdfFormFields.SetField("_Nombre", Me.NombreTextBox.Text & " " & Me.ApellidosTextBox.Text)
                pdfFormFields.SetField("O300", "INSTALACIONES DEPORTIVAS")
                pdfFormFields.SetField("EpigrafeIAE", "1/957")
                pdfFormFields.SetField("_Locali_", "PAMPLONA")
                pdfFormFields.SetField("_Provin_", "NAVARRA")
                pdfFormFields.SetField("O310", Now.Day & "-" & Now.Month & "-" & Now.Year)
                pdfFormFields.SetField("O99", "Yes")
                pdfFormFields.SetField("100", Now.Year)

                pdfStamper.FormFlattening = True

                MessageBox.Show("Modelo creado con éxito en: " & rutafinal & "\" & nombrefinal, "Mensaje", MessageBoxButtons.OK)
                ' close the pdf
                pdfStamper.Close()
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            If Not pdfStamper Is Nothing Then
                pdfStamper.Close()
            End If
        End Try
Pues bien en el siguiente post colgaré la nueva versión beta para SEPA del Norma34Creator en la que estoy trabajando a la que le falta un poquillo más de testeo así como más cosas en las que me estoy reciclando como temas de boostrap, de jquery y más cosillas que vea interesante por ahí que merenca la pena comentar.