Generando Certificados / Diplomas con Python + rst2pdf

Resulta que este 28 de Abril es la FLISoL 2012 y junto a otros integrantes de SanLuiX (el grupo de usuarios de software libre de San Luis) vamos a estar en la sede de Villa Mercedes de la Universidad Católica de Cuyo colaborando con la comunidad y llevando adelante el festival :-). A que viene todo esto se preguntarán; viene a que para emitir certificados de asistencia a la FLISoL nos surgió la necesidad de contar con algún método para generar los certificados masivamente usando software libre, y aquí es donde entra en juego Python y rst2pdf.

Después de pensar un rato, terminé con la siguiente estructura de archivos:

  • filsol (directorio)
    • asistentes.csv
    • certificado.rst
    • escudo.png
    • generar_certificados.py
    • pdf (directorio)

Veamos uno por uno:

asistentes.csv

Es un archivo .csv con la información personal de los asistentes; para las pruebas que hice usé el siguiente contenido de ejemplo:

dni1,apellido1,nombre1
dni2,apellido2,nombre2
etc...

certificado.rst

Es la estrucutra del certificado a imprimir, con los campos a reemplazar enumerados entre {}. Usemos por ejemplo el siguiente:

===========
FLISOL 2012
===========

.. image:: escudo.png
 :scale: 70

----------------------------
Universidad Católica de Cuyo
----------------------------

Por la presente se deja constancia que **{1} {2}**, *D.N.I. {0}* ha participado del evento FLISol 2012 en calidad de asistente. Realizado en la sede Villa Mercedes de la Universidad Católica de Cuyo el día 28 de abril de 2012.

escudo.pg

Como su nombre lo indica, es el escudo de la universidad, podría ser el logo de la FLISol o cualquier imagen que quisieran. Vale aclarar que este archivo no es obligatorio y depende de lo que hayan hecho en su archivo rst como maqueta del certificado.

generar_certificados.py

Este es el script de Python que genera todos los certificados a partir del listado en csv de asistentes. El código creo que se explica por sí mismo, se los dejo a continuación:

#!/usr/bin/env python
#-*- encoding: utf-8 -*-

from csv import reader
import subprocess

print 'Abriendo listado...',
# Esto se puede poner feo...
listado = reader(open('asistentes.csv','r'))
total = len(list(listado))
listado = reader(open('asistentes.csv','r'))
print 'listo.'

print 'Abriendo certificado...',
certificado = open('certificado.rst').read()
print 'listo.'

print listado
print 'Encontrados', total, 'asistentes:'
for nro, asistente in enumerate(listado):
    dni = asistente[0]
    apellido = asistente[1]
    nombre = asistente[2]
    certificado_final = certificado.format(dni,apellido,nombre)

    print 'Generando certificado para', apellido.upper(), nombre + '...',

    p = subprocess.Popen(['rst2pdf',
                        '-s',
                        'freetype-serif,a4-landscape,twelvepoint',
                        '-o',
                        './pdf/' + dni + '-' + apellido + '-' + nombre + '.pdf'
                        ],
                        stdin=subprocess.PIPE
                        )
    p.stdin.write(certificado_final)
    p.communicate()
    print 'listo', str(nro+1), 'de', str(total) +'.'

Seguramente se puede mejorar (mucho) el código, pero como prueba de concepto resultó ser más que suficiente :-D. El script genera un pdf en la carpeta (adivinen…) pdf a partir del archivo rst por cada asistente, reemplazando el nombre y DNI que corresponde. Para ello utiliza el ejecutable de rst2pdf, seguramente se podría hacer llamando a la librería, pero la verdad no me puse a investigar cómo hacerlo.

Uso una PIPE de subprocess para alimentar a rst2pdf con el rst modificado con los datos del asistente directamente y no tener así que guardar un archivo rst distinto a disco por cada persona.

Creo que quedó bastante bien, en un puñado de líneas y nos vino al pelo! Cuando lo probemos bien les cuento cómo se portó.

Anuncios

11 pensamientos en “Generando Certificados / Diplomas con Python + rst2pdf

  1. no se programar, pero mirando tu codigo y googleando poco a poco consegui que me imprimiera y generara el PDF, solo debo corregir lo de la imagen pero me has ayudado para la organizacion del SFD, Debian Day y Flisol 2014, voy a decirle a unos amigos que te echen una mano con el codigo mostrandole lo que hice con el tuyo…gracias

  2. Te voy a molestar otra vez, amigo, resulta que quiero organizar otro evento (el 9no Debian Day) y aqui tengo un certificado de ejemplo http://www.flickr.com/photos/w3asel/6044141359/?edited=1 que use en un evento anterior, como estamos puliendo el sistema de registro, el problema que veo es que quiero usar de fondo la imagen o formato del certificado y que la script llene los campos que aparecen vacíos con los datos del asistente o ponente, ¿que se podría hacer al respecto?

    Te comento que tengo una asistencia de 50 personas para el Debian Day aproximadamente, y lo haremos de experimento porque en los Flisol que organizamos la asistencia se ubica en 300~500 personas en los últimos años, Se que alguien en otra parte una vez lo hizo, pero nunca publico la fuente. Gracias de antemano,

        • Gracias amigo, te debo una, lo usare luego de modificarla, ya que aqui en .ve usamos nombres, apellidos, Cedula (dni) y el rol, lo pondre en producción en unos pocos dias, antes del evento (17-08-2013) y te contaré como me fue

          Como te dije la estoy comentando con los compañeros para ver si en el sistema de registro que vamos a montar,incorporamos esta script para que el mismo usuario se registre, y el mismo cree su certificado y lo descargue e imprima para que lo llevel al dia del evento y se le valide.

          La otra opción (mira esto http://python.org.ar/Recetario/FacturaPyFpdf) es incorporar un codigo de barras para darle validez en linea y que de esa forma ya el asistente tenga su certificado valido en linea y que solo lo imprima si necesita en fisico,

          Aqui en mi ciudad hemos optado por ahorro de costos, hacerlos en linea, lo enviamos por correo, y el que este interesado lo imprime, como nuestros eventos son generalmente gratuitos no cobramos por certificado, y de esta forma nos ahorramos la impresión contribuyendo al ambiente xD Por lo cual tu ayuda a mejorar nuestra forma de trabajo cae como anillo al dedo.

          Gracias y cualquier cosa te vuelvo a avisar.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s