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
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ó.