Generar certificados con Python
Tags: python, agile, beginners, help
Published: 2020-05-30 23:29:14

Antes de empezar quiero dar reconocimiento a Mursal Furqan por crear el código que se usará en este artículo para hacer esta versión en español.

Desde enero de 2020 formo parte del programa Microsoft Student Partners, ahora conocido como Microsoft Learn Student Ambassadors. Los integrantes de este programa nos encargamos de realizar regularmente talleres para ayudar a nuestras comunidades a aprender más sobre tecnología y otras herramientas de la familia de Microsoft que puedan facilitar sus actividades diarias. Considerando lo anteriormente expuesto, en la mayoría de las ocasiones las personas que asisten a nuestros talleres nos preguntan si es posible que ellos reciban un certificado por haber participado en dicho taller. El programa de Microsoft nos otorga una plantilla para dar certificados de participación a quienes asistan a nuestro talleres o eventos.

Ahora, el problema que se presenta es el siguiente. ¿Cómo puedo hacer 20 o 100 certificados con el nombre de cada uno de los participantes? Este artículo explicará detalladamente como podemos usar librerías de Python para edición de imágenes y análisis de datos para hacer esta tarea.

Antes de empezar necesitamos tener algunas cosas ya preparadas, las cuales son:

1. Instalar un entorno de programación. (En mi caso usaré Visual Studio Code).
2. Instalar el intérprete de Python en nuestra computadora.
3. Instalar Pandas y Pillow, que son las librerías que usaremos para este código.
4. Crear un archivo de Excel o .csv con los nombres de los participantes.
5. Tener una plantilla de nuestro certificado previamente modificada y exportada en formato .jpg (la imagen debe estar en formato de color RGB)
6. Descargar un archivo de tipo de letra  en formato .tff 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/aihvmn6ccglul37lh2jw.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/k91fpibh8mzjkw98r84d.jpg)

Para instalar Python pueden entrar a este [link](https://www.python.org/downloads/). Ahora, para instalar las librerías de Pandas y Pillow dentro del entorno de programación de nuestra preferencia debemos crear un archivo y una terminal de Python para escribir las siguientes líneas.

Primero, para asegurarnos que tenemos la ultima versión de “PIP”, escribiremos.

```python
pip install pip
```

Una vez hecho esto procederemos a instalar las otras librerías.

```python
pip install pandas
pip install pillow 
```

Perfecto, una vez que tengamos estas librerías instaladas tenemos que crear un proyecto nuevo y dentro de este proyecto crear el archivo con un nombre de nuestra preferencia. Una vez hecho esto, localizaremos la carpeta de este proyecto y dentro de ella guardaremos todo lo anteriormente expuesto; el archivo Excel o .csv, la plantilla de nuestro certificado en formato .jpg y por ultimo, el tipo de letra en formato (.tff). Pueden descargar tipos de letra en esta [página](https://www.dafont.com/es/). Esto nos permitirá usar estos recursos dentro del archivo de Python.

Una vez hecho esto, exportaremos las librerías que usaremos en el proyecto y vamos a crear un código para hacer este trabajo para un único certificado. Luego lo haremos para todos.

```python
from PIL import Image, ImageDraw, ImageFont
import pandas as pd
```
Primero abriremos el archivo Excel o .csv usando pandas y tenemos que convertirlo en una lista. Al usar pandas para leer este tipo de archivos obtendremos un tipo de dato conocido como _DataFrame_. De forma análoga es como tener un libro de Excel. Si nuestro archivo tiene muchas columnas con varios datos de nuestros participantes deberemos indexarlo.

```python
#Archivo Excel

datos = pd.read_excel("Archivo.xlsx")
#Ahora tenemos que convertilo en una lista.
datos = datos["Nombres"] # De esta forma indexamos el DataFrame.
datos = datos.to_list() #Ahora tenemos una lista con únicamente los nombres de los participantes.

#Cuando ya se tiene un poco más de experiencia podría escribirse todo en una sola línea.

datos = pd.read_excel("Archivo.xlsx")["Nombres"].to_list()

#Archivo .csv
#Con el archivo .csv es igual así que lo haremos directamente, solo hay que cambiar de función para leer el archivo.

datos = pd.read_csv("Archivo.csv", sep=",") 
#Hay que agregar el tipo de separación del archivo luego el resto es lo mismo, la lista debe obtenerse así.

datos = pd.read_csv("Archivo.csv", sep=",")["Nombres"].to_list()
``` 
Ahora que tenemos todos los datos y asumiendo que solo hay un nombre en la lista, procederemos a llenar el primer certificado. Usando la función Image.open de Pillow abriremos la imagen que queremos modificar. Hay que escribir el nombre exacto de la imagen y también la extensión del archivo, todo entre "comillas".
```python
certificado = Image.open("certificado.jpg")
``` 
Ahora escribiremos el código que nos permitirá modificar este archivo que acabamos de abrir. Para ello necesitaremos algunos detalles extras como el tipo de letra, la ubicación donde estará el texto a escribir, su color y su tamaño.

```python
certificado = Image.open("certificado.jpg")
nuevo = ImageDraw.Draw(certificado)
#La variable nuevo representará las modificaciones al archivo certificado.

coordenadas = (290,968) 
#coordenadas (x,y) pueden obtenerse abriendo la imagen previamente en paint.
color_texto = (0,137,209)
#Hay que escribir el código del color en formato (R,G,B) 
tipo_letra = ImageFont.truetype("nombre.ttf", 75) 
#Se especifica el nombre del archivo .tff que guardamos previamente y el tamaño de la letra ("nombre.tff", tamaño)
``` 
Finalmente procederemos a modificar el archivo con esta información y guardarlo como un archivo .pdf, aunque también podemos hacerlo como un archivo .jpg

```python
 nuevo.text(coordenadas, datos[0], fill=color_texto, font=tipo_letra)
 certificado.save(datos[0]+".pdf")
```
La función text recibe los siguientes tipos de datos:
* Coordenadas, tupla con valores numéricos (x,y).
* datos[0], debe ser un valor "str" por eso se indexa la lista en su único valor porque este es un dato de tipo "str".
* color_texto, tupla con valores numéricos (R,G,B).
* tipo_letra, tupla con el nombre del tipo de letra y su tamaño ("str",int).

Por último, la función _save_ recibe un dato tipo _str_ que será el nombre del archivo a guardar. En nuestro caso se usó una concatenación para escribir el nombre de la persona más las extensión final del archivo. el código debe quedarnos de la siguiente manera.

```python
from PIL import Image, ImageDraw, ImageFont
import pandas as pd
datos = pd.read_excel("Nombres.xlsx")["Nombres"].to_list()
certificado = Image.open("certificado.jpg")
nuevo = ImageDraw.Draw(certificado)
coordenadas = (290,968)
color_texto = (0,137,209)
tipo_letra = ImageFont.truetype("nombre.ttf", 75)
nuevo.text(coordenadas, datos[0], fill=color_texto, font=tipo_letra)
certificado.save(datos[0]+".pdf")
```

Finalmente implementaremos un lazo *for* para hacerlo de forma masiva con n cantidad de nombres. El código debe quedarnos de la siguiente forma.

```python
from PIL import Image, ImageDraw, ImageFont
import pandas as pd
datos = pd.read_excel("Nombres.xlsx")["Nombres"].to_list()
for nombre in datos:   
    certificado = Image.open("certificado.jpg")
    nuevo = ImageDraw.Draw(certificado)
    coordenadas = (290,968)
    color_texto = (0,137,209)
    tipo_letra = ImageFont.truetype("nombres.ttf", 75)
    nuevo.text(coordenadas, nombre, fill=color_texto, font=tipo_letra)
    certificado.save(nombre+".pdf")
```
Al final tendremos un resultado como este

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/sq0l4qehhq4r9ngi227h.png)

¡Si desean pueden entrar al artículo original en ingles de Mursal Furqan en este [enlace](https://medium.com/analytics-vidhya/generate-certificates-using-python-a7685985ed77)! Apóyenlo dándole like a su publicación en Medium.  

Aquí también está su [perfil de Medium](https://medium.com/@mursalfurqan) para que puedan ver sus otras publicaciones en ingles.

#MSFTStudentPartner
#MSFTStudentAmbassadors