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



