Rellenar un formulario PDF a partir de una consulta en MS-Access

Se trata de rellenar un formulario PDF desde Access. Para ello usaremos la herramienta libre PDFtk. En Access crearemos un nuevo módulo y una clase VBA

1) El formulario PDF

Podemos crear un formulario en un documento PDF. Para ello hay que agregar los campos dibujándolos sobre el PDF y ajustando sus propiedades

1.1) Cómo crear el formulario con PDFescape.com

Es un editor PDF gratuito en Internet. Lo usaremos para crear los campos del formulario en el PDF

Añadir el primer campo de texto en el PDF:

Añadir el primer campo de checkbox en el PDF:

Los campos aparecen en verde si están desbloqueados y en azul si están bloqueados:

Cambiar el tamaño de la fuente a 16 puntos:

1.2) Documentos PDF

2) La herramienta pdftk

Descarga PDFtk Free

Incluye la herramienta en línea de comandos PDFtk Server. Lo usaremos para rellenar los campos del formulario PDF. Al acabar de bajar e instalar este programa dispondremos de la orden pdftk que se usa desde el terminal.

Apuntes de pdftk

3) La base de datos MS-Access

3.1) Código VBA

En la ventana de código Visual Basic (ALT F11) importa los siguientes módulos:

  • apiShell.bas — Ejecución de un programa en el terminal esperando a que acabe
  • classFDF — Clase para rellenar y guardar un fichero FDF (Form Data Fields)

4) Ejemplos

4.1) Rellenar el formulario PDF

Dim raiz As String
Dim inPDF As String
Dim inFDF As String
Dim outPDF As String
Dim fdf As classFDF
Dim cmd As String

'Directorio de la BD
raiz = CurrentProject.path & "\"

'Documento PDF con el formulario
inPDF = raiz & "pdf\Formulario.pdf"

'Archivo que contendrá los datos para el formulario
inFDF = raiz & "pdf\Datos.fdf"

'Documento PDF que tendrá el formulario relleno con los datos
outPDF = raiz & "pdf\Resultado.pdf"

'Instanciar la clase FDF
Set fdf = New classFDF

'Añadir datos de tipo texto
fdf.AddText "campo1", "Dato1"
fdf.AddText "campo2", "Dato2"
fdf.AddText "campo3", "Dato3"

'Marcar casillas de verificación
fdf.AddCheck "campo4", True
fdf.AddCheck "campo5", False
fdf.AddCheck "campo6", True

'Guardar el archivo con los datos
fdf.Save inFDF

'Rellenar el formulario
cmd = "pdftk " & inPDF & " fill_form " & inFDF & " output " & outPDF
Call WaitShell(cmd, vbHide)

'Abrir el documento PDF resultante
Call ShellExec(outPDF)

4.2) Descarga el ejemplo básico

Descarga RellenarFormPDF_min.7z que incluye la base de datos y el formulario PDF

4.3) Descarga el ejemplo completo

Descarga RellenarFormPDF_full.7z que incluye la base de datos y el formulario PDF

  • Formulario para exportar un cliente en un formulario PDF:
  • Código del formulario:
    Private Sub ComandoFormPDF_Click()
        If Not IsNull(Me.cliente_id) Then
            Call rellenarFormClientePDF(Me.cliente_id)
        End If
    End Sub
  • En el módulo appFormPDF.bas está definida la función rellenarFormClientePDF

Comentarios

  1. 1 Jesús 2018-06-04 Hace un mes
    Hola buenas tardes.

    Muy buen post.

    Descargo el ejemplo completo con bases de datos y formulario PDF.
    Cuando lo descomprimo y ejecuto el formulario y en el panel Informe Clientes, selecciono al primero (por ejemplo) y le doy a rellenar formulario salta error 53 en tiempo de ejecución, archivo no encontrado.
    ¿Qué estoy haciendo mal?

    Muchas gracias de antemano.

    Un saludo.
  2. 2 Francisco 2018-06-05 Hace un mes
    Gracias Jesús
    Me he descargado el ejemplo a ver si había algún problema pero me funciona bien.
    La base de datos utiliza el archivo "FormularioCliente.pdf" que está en la subcarpeta "pdf". Comprueba que la carpeta y el archivo están donde les corresponde.
    Saludos
  3. 3 Jesús 2018-06-07 Hace un mes
    Nada Francisco, ¿puede que sea por mi versión de Adobe Reader (y Acrobat X Pro) y/o Access (2013)?
    Lo debo de estar haciendo mal:
    - Descargo el ej. completo comprimido.
    - Extraigo el ej.
    - Me queda todo en el escritorio. El archivo y la carpeta.
    - Al ejecutar el archivo rellenar..accdb selecciono un cliente y pincho en rellenar formulario pdf.
    - Salta el error 53. Le doy a depurar y me sale esta línea en amarilla:
    Dim hMod As Long: hMod = shell(appName$, windowStyle)
    ¡Muchas Gracias!
    Salu2
  4. 4 Francisco 2018-06-07 Hace un mes
    Hola Jesús. A mi me parece correcto lo que haces para probarlo. No creo que sea problema de las versiones aunque nunca se sabe.
    La línea que te da error lo que tendría que hacer es ejecutar la aplicación pdftk para crear un pdf rellenado con los campos. El error 53 significa que no encontró el archivo. Ahora que caigo el archivo que no encuentra es el comando pdftk.
    La solución entonces consiste en instalar el "PDFtk Free" en tu ordenador. En el punto 2 de mi artículo lo estaba indicando.
    Saludos
  5. 5 Jesús 2018-06-08 Hace un mes
    ¡Lo conseguí Francisco!

    Tenía descargado el programa pero no instalado... para matarme :)

    Ahora quiero hacer mi propio formulario que ya lo tengo hecho. Lo diseñé en illustrator, lo exporté como pdf y con el Acrobat lo he editado y le he creado el formulario.

    Ahora toca editar los parámetros para rellenar y una base de datos nueva.

    Ya le contaré :)

    Muchas gracias por todo Francisco.

    A seguir disfrutando de este gran post.

    ¡Un saludo!
  6. 6 Jesús 2018-06-11 Hace un mes
    Buenas de nuevo Fransico.

    Ya voy montando casi casi al completo toda la maquinaria.

    No tengo ni idea de como se usa el terminal con la orden pdftk, ni mirando el manual ni nada. Loco estoy. Todo el fin de semana dándole vueltas.

    Me salta un error "3061 en tiempo de ejecución. Pocos parámetros. Se esperaba 4" en la línea (en amarilla):
    Set rs = db.OpenRecordset(sql, dbOpenForwardOnly).

    Supongo que será por no haber podido lanzar el programa pdftk desde el terminal.

    Muchas gracias de nuevo.

    Un saludo.
  7. 7 Francisco 2018-06-12 Hace un mes
    Hola Jesús,

    Ese error que te sale no parece que tenga nada que ver con el pdftk sino con la variable sql. Seguramente se trata de que has puesto dentro del sql unos campos que no existen o que están mal escritos. Cuando Access no encuentra los campos se piensa que son parámetros y como no tiene el valor de los parámetros da error.

    Saludos
  8. 8 Jesús 2018-06-13 Hace un mes
    Buenas tardes Francisco.
    Le comento lo que intento hacer.
    Tengo que rellenar órdenes de trabajo para arreglar bicicletas de mis clientes y estoy usando su ejemplo, pero no consigo nada.

    Una base de datos de clientes con:
    Nombre
    DNI
    Direc.
    Móvil
    Bicicleta
    Color
    Fecha recibida

    Luego, líneas donde rellenar lo que hay que reparar, cambiar o poner y luego cantidad y su precio.

    Le adjunto un enlace para que vea la idea:
    https://ibb.co/cmRoVJ

    Ya me estoy volviendo loco.

    Muchas gracias de nuevo.

    Un saludo.
  9. 9 Francisco 2018-06-15 Hace un mes
    Hola Jesús,

    Por la imagen que envías te recomendaría que creases un INFORME en Access. Luego, en la vista preliminar del informe, lo podrías exportar a PDF.

    Lo que describo en este artículo, el formulario PDF y el uso de pdftk, no creo que sean convenientes para este caso ya que eres tú quien diseña como ha de ser el informe. Sólo sería útil para un PDF previamente diseñado que fuese complicado y, por lo tanto, difícil de replicar con un informe Access,

    Busca algún videotutorial de cómo crear informes en Access.

    Suerte y un saludo
  10. 10 Jesús 2018-06-15 Hace un mes
    Estupendo.

    Eso intentaré :)

    Muchísimas gracias por todo Francisco.

    ¡Un saludo!
Proinf.net, ©2003-2018 ci 3.1.8 (CC) Esta obra está bajo una licencia de Creative Commons Este software está sujeto a la CC-GNU GPL