ACTUALIZACIÓN 14/9/2012: He desarrollado una versión de Pyploma con GUI. Si estás interesado en probarla, visita el repositorio del proyecto en Github.
Durante los últimos meses he participado en la organización de un ciclo de conferencias en la facultad. Una vez finalizado y tras la evaluación de los asistentes era el momento de realizar los diplomas. Los habituales lectores de este humilde blog ya sabréis que soy amante de las soluciones elegantes, así que me lancé a escribir un programita que generara los diplomas en formato LaTeX de forma automática y luego los compilara a pdf.
Pyploma es un script que, por supuesto, está escrito en python que coge un fichero LaTeX que contiene unos marcadores comentados y añade una serie de datos para cada entrada de una lista de datos. Aunque está originalmente pensado para generar diplomas, sustituyendo el dichero LaTeX podría servir para autorrellenar cualquier otro tipo de documento, incluso si está escrito en otro lenguaje.
Para que compile a pdf necesita tener instalado LaTeX y para unir los pdfs en un fichero depende de pdftk. No obstante estas funciones son opcionales y pueden comentarse en el script.
Hacerlo funcionar es tan sencillo como modificar en el script el nombre de la plantilla LaTeX y el de la lista de datos. Después escribir:
$ python pyploma.py
Y listo. Parece magia, pero no, es Python. Para ver el resultado, esta es la salida.
Si quieres descargar la plantilla LaTeX, la lista de datos y el script, sigue este enlace.
Plantilla LaTeX
\documentclass[12pt]{article} \usepackage[utf8]{inputenc} \usepackage[spanish]{babel} \usepackage{mathpazo} \renewcommand{\familydefault}{\rmdefault} \usepackage[landscape,a4paper]{geometry} \geometry{verbose,tmargin=0cm,bmargin=0cm,lmargin=0cm,rmargin=0cm} \usepackage{fancybox} \usepackage{calc} \usepackage{multicol} \usepackage{graphicx} \begin{document} ~ \vspace{1cm} \begin{center} \huge{Un Bioinformatiquillo (https://bioinformatiquillo.wordpress.com)\\ certifica que} \vspace{1cm} \Huge{\textbf{%pointname }} \vspace{1cm} \Large{con D.N.I. no.%pointdni ha asistido y superado los estudios\\ con una califiaci\'on de %pointcalification en el} \vspace{1cm} \Huge{\textbf{I CURSO DE REALIZACIÓN DE DIPLOMAS CON PYPLOMA}} \vspace{1cm} \Large{celebrado el 6 de julio de 2011 vitualmente en el blog, con una duraci\'on de un ratillo} \vspace{.5cm} \Large{Y para que as\'i conste se expide el siguiente certificado en el ciberespacio a \today.} \vspace{.5cm} \begin{multicols}{3} \small Delegado de asusntos LaTeros\\ \vspace{3cm} León Delátex Pérez %\vspace{1cm} Director de Pythonismo\\ \vspace{3cm} Ser Piente Grande %\vspace{1cm} El/La Alumno/a\\ \vspace{3cm} ~~~~~~~~~~ \end{multicols} \tiny El blog Un Bioinformatiquillo, con domicilio en el Vía Láctea s/n \end{center} \end{document}
Script en Python
Periquillo de los Palotes 00000001-A NOTABLE Rodolfo Chiquilicuatre 000000002-B SOBRESALIENTE Chavo del Ocho 00000003-C APROBADO
Script en Python
# -*- coding: utf-8 -*- # Este generador de diplomas lee una lista con nombre, dni y calificación para # rellenarlos en una plantilla LaTeX con un marcador para cada campo. # Opcionalemente compila los ficheros LaTeX generados y los une en uno solo. # Si la plantilla LaTeX da error de compilación, pulsar intro varias veces. print "Pyploma: Generador de diplomas en formatos LaTeX y pdf.\n" # Invocar al terminal from commands import * import commands def run_command(cmd): getstatusoutput(cmd) # Cargar lista de nombres lista = open("listadip", "r").readlines() #contador a = 100 for line in lista: # para cada persona... a += 1 #contador b = str(a) #pasa el contador a cadena salida = open("output" + b + ".tex","w") # crea fichero LaTeX para cada persona person = line[0:-1].split("\t") # pasar la cadena en lista text = open("certi.tex") # abrir documento LaTeX text = text.read() # leer documento LaTeX text_list = list(text) # pasa a lista y_cali = text.find("%pointcalification") # busca marcador de calificación z_cali = len("%pointcalification")+1 text_list[y_cali+z_cali:y_cali+z_cali] = list(person[2]) # inserta calificación y_dni = text.find("%pointdni") # lo mismo para el dni z_dni = len("%pointdni")+1 text_list[y_dni+z_dni:y_dni+z_dni] = list(person[1]) y_name = text.find("%pointname") # lo mismo para el nombre z_name = len("%pointname")+1 text_list[y_name+z_name:y_name+z_name] = list(person[0]) text_final = "".join(text_list) # de lista a cadena salida.write(text_final) # guarda los cambio en el fichero creado salida.close() # cierra el fichero creado run_command(str("pdflatex " + "output" + b + ".tex")) # compila el fichero LaTeX a pdf (opcional) print person[0] #control run_command(str("pdftk output*.pdf cat output todos_diplomas.pdf")) # crea pdf con todos los diplomas creados (opcional) print "\n¡FINAL DE LA OPERACIÓN!" #control
gracias, mu util en la escuelas y a los encargados de los papeleos. Para la colección de scripts
Me alegra que te haya interesado. Gracias.
Excelente script. Muchas gracias por tu aporte, me fue muy útil. Una preguntica al margen: ¿Cómo le puedo añadir un borde al diploma? Muchas gracias.
Gracias.
Podrías intentar modificar los márgenes de los archivos insertando en el preámbulo del fichero LaTeX esta línea:
\geometry{verbose,tmargin=0cm,bmargin=0cm,lmargin=0cm,rmargin=0cm}
También puedes echarle un vistazo a la nueva versión de pyploma con una interfaz gráfica.
https://github.com/PaquilloDubois/pyploma
Espero que te sirva.
Saludos.
Estimado, primero agradecer tu aporte desinteresado, pero al tratar de ejecutar tu script en Python, lo he probado con la version 2.7 y me da error en la linea 40 «ImportMSQLdb»… no estoy usando ninguna DDBB y al tratar de ejecutarlo con Python-3.5 me da un error en el print de la línea 93… y nop pude utilizarlo.
Agradecería si puedes dar una mano..
Gracias de antemano por tu tiempo.
Saludos
Pingback: Generando Certificados / Diplomas con Python + rst2pdf para eventos en Venezuela – Samuel R Osuna