Cómo crear archivos PDF

Este documento explica cómo generar archivos PDF de manera dinámica utilizando vistas de Django. Esto es posible gracias al excelente y de código abierto ReportLab biblioteca Python para PDF.

La ventaja de generar archivos PDF de manera dinámica es que puedes crear PDFs personalizados para diferentes fines – digamos, para diferentes usuarios o diferentes piezas de contenido.

Por ejemplo, Django se utilizó en kusports.com para generar cuadrados de la NCAA torneo amistoso, como archivos PDF, para las personas participantes en un concurso de March Madness.

Instalar ReportLab

La biblioteca ReportLab está disponible en PyPI. También hay una guía del usuario (no es casualidad que sea un archivo PDF) disponible para su descarga. Puedes instalar ReportLab con pip:

$ python -m pip install reportlab

Prueba tu instalación importándolo en el intérprete interactivo de Python:

>>> import reportlab

Si ese comando no levanta ningún error, la instalación funcionó.

Escribe tu vista

La clave para generar PDFs dinámicamente con Django es que la API ReportLab actúa sobre objetos como archivos y los objetos de respuesta FileResponse de Django aceptan objetos como archivos.

Aquí tienes un ejemplo «Hola Mundo»:

import io
from django.http import FileResponse
from reportlab.pdfgen import canvas


def some_view(request):
    # Create a file-like buffer to receive PDF data.
    buffer = io.BytesIO()

    # Create the PDF object, using the buffer as its "file."
    p = canvas.Canvas(buffer)

    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()

    # FileResponse sets the Content-Disposition header so that browsers
    # present the option to save the file.
    buffer.seek(0)
    return FileResponse(buffer, as_attachment=True, filename="hello.pdf")

El código y las notas deberían ser autoexplicativos, pero hay algunas cosas que merecen mención:

  • La respuesta traducida es la siguiente:

  • Cuando se pasa as_attachment=True a FileResponse, establece el encabezado Content-Disposition adecuado y eso le dice a los navegadores que mostrar una caja de diálogo para preguntar/confirmar cómo manejar el documento, incluso si hay un valor por defecto configurado en la máquina. Si se omite el parámetro as_attachment, los navegadores manejarán el PDF utilizando el programa/plugin con el que han sido configurados para usarlos.

  • Puedes proporcionar un parámetro filename arbitrario. Se utilizará por los navegadores en la caja de diálogo «Guardar como…».

  • Puedes conectar a la API ReportLab: El mismo buffer pasado como primer argumento a canvas.Canvas se puede alimentar al clase FileResponse.

  • Ten en cuenta que todos los métodos de generación de PDF posteriores se llaman en el objeto PDF (en este caso, p) – no en buffer.

  • Finalmente, es importante llamar a showPage() y save() en el archivo PDF.

Nota

ReportLab no es seguro para hilos. Algunos de nuestros usuarios han informado problemas extraños con vistas Django que generan PDFs accedidas por muchas personas al mismo tiempo.

Otros formatos

Ten en cuenta que no hay mucho en estos ejemplos que sea específico del PDF – solo los bits utilizando reportlab. Puedes utilizar una técnica similar para generar cualquier formato arbitrario que puedas encontrar una biblioteca de Python.

Ver también

Django Packages proporciona un comparación de paquetes que ayudan a generar archivos PDF desde Django.