PDF’s en django con reportlab

  
26 de Febrero de 2015   0  

Hola que tal amigos Pythonistas hace un tiempo que no escribía y se debe a falta de tiempo, pero … hey! aquí estoy nuevamente.

En esta oportunidad les traigo un breve tutorial que sin duda lo usaremos alguna vez, todos hacemos proyectos pero la parte importante es generar reportes, ya sean listas de Clientes, Productos, Ventas, Gráficas comparativas, etc. los cuales nos permitan medir o entregar algo palpable para el usuario,  aquí entraría la filosofía “si no se puede medir no sirve“.

Reportlab es la solución para crear documentos PDF increíblemente rápidos.

Podemos instalarlos desde PIP tecleando:

pip install reportlab
 

En esta ocasión vamos a hacer un ejemplo creando un pdf de una lista de datos que son llamados de un modelo llamado Clientes, omitiré los pasos: crear un proyecto en django, la url y vistas, para concentrarnos en generar el PDF.

Bueno ya teniendo los datos que queremos mostrar en este ejemplo una tabla de Clientes

tabla_clientes

Click para ampliar

 

Creamos una url que nos consulte a una función dentro de nuestro views.py quedando de la siguiente manera:

# -*- coding: utf-8 -*-
from io import BytesIO

from django.http import HttpResponse
from django.views.generic import ListView
from reportlab.platypus import SimpleDocTemplate, Paragraph, TableStyle
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import Table

from .models import Clientes

class IndexView(ListView):
    template_name = "index.html"
    model = Clientes
    context_object_name = "c"

def generar_pdf(request):
    print "Genero el PDF"
    response = HttpResponse(content_type='application/pdf')
    pdf_name = "clientes.pdf"  # llamado clientes
    # la linea 26 es por si deseas descargar el pdf a tu computadora
    # response['Content-Disposition'] = 'attachment; filename=%s' % pdf_name
    buff = BytesIO()
    doc = SimpleDocTemplate(buff,
                            pagesize=letter,
                            rightMargin=40,
                            leftMargin=40,
                            topMargin=60,
                            bottomMargin=18,
                            )
    clientes = []
    styles = getSampleStyleSheet()
    header = Paragraph("Listado de Clientes", styles['Heading1'])
    clientes.append(header)
    headings = ('Nombre', 'Email', 'Edad', 'Dirección')
    allclientes = [(p.nombre, p.email, p.edad, p.direccion) for p in Clientes.objects.all()]
    print allclientes

    t = Table([headings] + allclientes)
    t.setStyle(TableStyle(
        [
            ('GRID', (0, 0), (3, -1), 1, colors.dodgerblue),
            ('LINEBELOW', (0, 0), (-1, 0), 2, colors.darkblue),
            ('BACKGROUND', (0, 0), (-1, 0), colors.dodgerblue)
        ]
    ))
    clientes.append(t)
    doc.build(clientes)
    response.write(buff.getvalue())
    buff.close()
    return response

Hay dos maneras de hacer reportes usando reportlab:

  • “Pintando” con canvas usando coordenadas (X,Y)
  • Usando PLATYPUS

PLATYPUS es una libreria de alto nivel que nos permite hacer documentos complejos con mínimo esfuerzo.

De la linea:

Importo BytesIO nos permite un lugar de almacenamiento temporal del pdf

6 a la 10 importo todo lo que necesitare para generar mi documento:

  • SimpleDocTemplate: La plantilla del documento
  • Paragraph: Para escribir párrafos
  • TableSytle: Lo que hará bonita a nuestra tabla
  • getSampleStyleSheet: Importamos una clase de hoja de estilo
  • colors: Esto aún no descubro que hace 😆
  • letter: El tamaño de la hoja
  • Table: Nos permite crear tablas (igual esta el longTable)

23 decimos que va a hacer un documento PDF

24 damos el nombre al documento

26 descomentamos la linea si queremos descargar el documento a nuestra computadora

27 almacenamos BytesIO a la variable buff

28 configuramos nuestro documento

35 creamos una lista

36 almacenamos getSampleStyleSheet a una variable llamada styles

37, 38 agregamos un titulo a nuestro documento usando Paragraph

39 agregamos los encabezaos de las Columnas

40 aqui creamos una variable que almacena todos los datos que tengo en el modelo Clientes

43 creo una variable donde agrego a Table los nombres de las columnas con sus datos correspondientes que están el allclientes

44 doy color a la tabla

51 agrego todo a mi lista

52 genero el documento a partir de la lista clientes

53 Recupero el archivo almacenado

54 Librero la memoria

55 regreso la respuesta 

El código lo podrás encontrar aquí: Github (no olvides instalar antes los requerimientos)

Saludos y hasta el próximo post no olvides seguirnos en nuestras redes sociales

 



Alex Dzul

FullStack Python / Django Developer. #jslove

Temas relacionados