Para crear un PDF simple con Python usaremos RerportLab, que es una de las bibliotecas más ampliamente usadas.
El código de este ejemplo es sencillo:
import time from reportlab.lib.enums import TA_JUSTIFY from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import inch # decodigo.com doc = SimpleDocTemplate("/home/decodigo/Documentos/python/prueba.pdf", pagesize=letter, rightMargin=72, leftMargin=72, topMargin=72, bottomMargin=18) Story = [] logotipo = "/home/decodigo/Documentos/python/python_logo.png" nombreRevista = "Programación Avanzada" numero = 4 precio = "10.00" fechaLimite = "27/09/2017" obsequio = "Taller de Python" formatoFecha = time.ctime() nombreCompleto = "José Rodriguez" partesDeDireccion = ["Calle con número 123", "Colonia, Código Postal 12345"] imagen = Image(logotipo, 1 * inch, 1 * inch) Story.append(imagen) estilos = getSampleStyleSheet() estilos.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY)) texto = '%s' % formatoFecha Story.append(Paragraph(texto, estilos["Normal"])) Story.append(Spacer(1, 12)) # Se construye la dirección texto = '%s' % nombreCompleto Story.append(Paragraph(texto, estilos["Normal"])) for part in partesDeDireccion: texto = '%s' % part.strip() Story.append(Paragraph(texto, estilos["Normal"])) Story.append(Spacer(1, 12)) texto = 'Estimado %s:' % nombreCompleto.split()[0].strip() Story.append(Paragraph(texto, estilos["Normal"])) Story.append(Spacer(1, 12)) texto = 'Nos gustaría darle la bienvenida como suscriptor a nuestra revista %s ! \ Recibirá %s números con un precio introductorio de $%s. Por favor responda antes de \ %s para comenzar a recibir su suscripción y obtenga además su obsequio: %s.' % (nombreRevista, numero, precio, fechaLimite, obsequio) Story.append(Paragraph(texto, estilos["Justify"])) Story.append(Spacer(1, 12)) texto = 'Gracias y esperamos haberle servido.' Story.append(Paragraph(texto, estilos["Justify"])) Story.append(Spacer(1, 12)) texto = 'Sinceramente,' Story.append(Paragraph(texto, estilos["Normal"])) Story.append(Spacer(1, 48)) texto = 'Daniel López' Story.append(Paragraph(texto, estilos["Normal"])) Story.append(Spacer(1, 12)) doc.build(Story)
En este ejemplo se hacen algunas declaraciones que son importantes. Primero se declara y se crea el tipo de documento que usaremos:
doc = SimpleDocTemplate("/ruta/prueba.pdf", pagesize=letter, rightMargin=72, leftMargin=72, topMargin=72, bottomMargin=18)
En las líneas de código anteriores especificamos el nombre de archivos PDF que vamos a crear y sus dimensiones.
Declaramos además la ruta del una imagen en formato png (un cuadrado con transparencia de 180×180 pixeles) del que más adelante definiremos posición y dimensiones dentro del documento.
logotipo = "/ruta/python_logo.png"
imagen = Image(logotipo, 1 * inch, 1 * inch) Story.append(imagen)
También declaramos y usamos de forma dinámica al menos dos estilos para el texto. «Normal» que viene por default y uno que agregamos dinámicamente llamado «Justify».
estilos = getSampleStyleSheet() estilos.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
Puedes observar que el contenido de nuestro documento se va construyendo gradualmente con la ayuda de la variable Story.
Story.append(imagen) . Story.append(Paragraph(texto, estilos["Normal"])) Story.append(Spacer(1, 12))
Vamos agregando Parrafos, imágenes o simples espacios.
Finalmente usamos «build» para generar nuestro documento:
doc.build(Story)
Y debes obtener algo como esto:
Desde luego, cuando copies el código no olvides cambiar la ruta del archivo PDF que se va a generar y la de la imagen, que puedes cambiar por otra de un tamaño similar pero con la misma extensión. Esperamos que este ejemplo sencillo sea de utilidad para que puedas construir documentos más elaborados.
Más información en: http://www.reportlab.com
Más información en inglés: https://geekole.com/pdf-with-reportlab-in-python/
Excelente ejemplo, justo lo que estaba buscando, solo me quedó una duda, para poder asignarle el title al PDF para que no aparezca: (anonymous) como se podría hacer?