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

Minutas del Primer PyDay SL

Hace dos días pasaba el primer PyDay realizado en la provincia de San Luis; en evento distinto para lo que se acostumbra a tener por estos pagos, pero que no dejo de ser interesante, acercando la comunidad Python y dando a conocer este hermoso lenguaje que tanto nos apasiona a los interesados que se acercaron a las jornadas. Sigue leyendo

How to create and decode a QR Code in Python using qrtools

This is a mini-How-to for creating and decoding QR Codes in Python using the qr-tools library.

What you need…

First of all you need qrtools.py, you can get it from the QR Toosl Launchpad page:

http://bazaar.launchpad.net/~qr-tools-developers/qr-tools/python-qrtools-trunk/view/head:/qrtools.py

or you can install it from the QR Tools Stable PPA if you happen to be using Ubuntu:

https://code.launchpad.net/~qr-tools-developers/+archive/daily

If you go with the PPA, you can check that qrtools is available in your system like this:

  1. Open a terminal and execute: python
  2. Once you are into python, write import qrtools and press enter; if you don’t get any message everything is OK.
If you choose to download qrtools.py, put the file in the same directory where your script is going to be, for example: /home/me/myproject/.
Once you have the qrtools library available from your python enviroment, we can go on with the next steps.

Introducing QtQR: a QR Code generator and decoder.

DISCLAIMER: Este post va en Inglés.. pronto lo paso al español.. Sepan disculpar.

What is QtQR?

QtQR is an graphical application for creating QR Codes easily; It also let’s you decode a QR Code stored on an image file or scan a printed one with your webcam.

…a QR what?

I don’t know, ask the japanese guys.. all I can say is that a QR Code is a two-dimensional barcode that looks something like the image below. According to the Wikipedia:

QtQR logo

QR Code used as logo for QtQR

“A QR code (short for Quick Response) is a specific matrix barcode (or two-dimensional code), readable by dedicated QR barcode readers and camera phones. The code consists of black modules arranged in a square pattern on a white background. The information encoded can be text, URL or other data.
Common in Japan, where it was created by Toyota subsidiary Denso-Wave in 1994, the QR code is one of the most popular types of two-dimensional barcodes. QR is the abbreviation for Quick Response, as the creator intended the code to allow its contents to be decoded at high speed[…]”

That’s for the formal definition, basically the QR Codes are useful for sharing a lot of information with a simple scan. They are used by the marketing guys for example in publicity. You can put an url, all your contact info, a predifined e-mail message, a sms message, a telephone number and anything you can think of on a QR code and anyone with a modern phone (not necessary a smartphone) can scan the code with the phone’s camera and decode all the data.

Say you want to make a personal presentation card with your contact information like your name, address, e-mail and phone number. You can put all that into a QR code, print it in the back of the card and instead of copying by hand your number a client can scan the code with his phone. 🙂 are you starting to like them?

There are several alternatives for creating a QR Code: websites, smartphone applications and there is even a command line application for Linux called qrencode. QtQR is a GUI front end for the latter made in Python and PyQt4.

QtQR 1.0

QtQR started as a simple wrapper for the command line program qrenconde inspired by a blog post. You can still download it from the google code page. Then I added the decoding feature using zbar; you can see how it worked in the following screencast:

At the same time David Green started to work on a GTK based GUI, so we got in contact and joined forces. From this the QR Tools project was borned; QR Tools project formed by:

  • python-qrtools: a library for creating and decoding QR Codes.
  • QtQR: a Qt4 based GUI.
  • QR Code Creator: a GTK based GUI.
In python-qrtools we work together with David making the core functions that I use in QtQR; you can even download the library and use it in your own projects to create or decode QR Codes.

The next step was to add templates for encoding text, urls, email address, sms and telephone numbers; setting qrenconde parameters and the capability to decode using a webcam. This realease was called QtQR 1.0. You can see a screenshot below.

QtQR 1.0 Screenshot
QtQR 1.0 Screenshot

at that moment QtQR was covered by OMG! Ubuntu! and got a lot of interest from the community. Right now we are working on the 1.2 version of QtQR, fixing bugs and adding features.

Sigue leyendo

Diccli…

… o cómo hacer un diccionario en python en menos de 50 lineas

Como sabrán (?) estoy haciendo un curso de Italiano per piacere y porque estaba completamente desocupado mas que nada… resulta que buscando y buscando no hay muchos traductores on-line de Italiano a Español (y viceversa) vaya uno a saber a que se debe; lo que si encontré en “All free dictionaries project” http://www.dicts.info/. De su página se pueden bajar unos archivos “.txt” para varios idiomas, entre los cuales encontré uno con traducciones de Italiano al Español :D.

El archivo está organizado más o menos así:

[espacio]palabra[espacio][tab][espacio]traduccion[espacio][tab][espacio]tipo de palabra (adjetivo, verbo, etc.)[espacio]

Como verán, no es muy díficil hacer un programita que permita separar todo eso.. con la ayuda de split y slices sale con fritas! 😀

Sigue leyendo