Come creare file PDF

Questo documento spiega come produrre PDF dinamicamente usando le views di Django. Questo è reso possibile dall’eccellente libreria open-source ReportLab Python PDF.

Il vantaggio di generare file PDF dinamicamente è che puoi creare PDF personalizzati per differenti scopi – , per differenti utenti o per differenti parti del contenuto.

Per esempio, Django è stato usato in kusports.com per generare bracket di torneo printer-friendly per i tornei NCAA, come file PDF, per le persone che partecipavano alla gara March Madness.

Installa ReportLab

The ReportLab library is available on PyPI. A user guide (not coincidentally, a PDF file) is also available for download. You can install ReportLab with pip:

$ python -m pip install reportlab
...\> py -m pip install reportlab

Test your installation by importing it in the Python interactive interpreter:

>>> import reportlab

Se quel comando non genera nessune errore, l’installazione ha funzionato.

Scrivi la tua vista

La chiave per generare PDF dinamicamente con Django è che le API di ReportLab agiscono su oggetti file-like e l’oggetto di Django FileResponse accetta oggetti file-like.

Qui un esempio di «Hello World»:

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")

Il codice ed i commenti dovrebbero essere auto esplicativi, ma alcuni dettagli meritano un approfondimento:

  • La risposta imposterà automaticamente il tipo MIME application/pdf basato sull’estensione del file. Questo dice ai browser che il documento è un file PDF, piuttosto che un file HTML o un contenuto binario generico application/octet-stream.
  • Quando as_attachment=True viene passato a FileResponse, imposta l’header Content-Disposition appropriato e dice ai browser web di mostrare una finestra di dialogo che richiede/conferma come gestire il documento anche se sulla macchina è impostato un valore predefinito. Se il parametro as_attachment viene omesso, i browser gestiranno il PDF utilizzando qualsiasi programma/plugin siano stati configurati ad usare per i PDF.
  • Puoi scegliere un parametro filename arbitrario. Verrà utilizzato dai browsers nella finestra di dialogo «Salva come..».
  • È possibile agganciarsi all’API ReportLab: lo stesso buffer è passato come primo argomento alla classe canvas.Canvas può alimentare la classe FileResponse .
  • Si noti che tutti i metodi di generazione PDF successivi sono chiamati sull’oggetto PDF (in questo caso, p) – non su `` buffer``.
  • Infine, è importante chiamare showPage() e save() sul file PDF.

Nota

ReportLab non è thread-safe. Alcuni dei nostri utenti hanno riportato strani problemi con Django view che generano PDF quando vi accedono più persone allo stesso tempo.

Altri formati

Nota che non ci sono molti esempi specifici per i PDF – solo alcuni che usano reportlab. Puoi usare tecniche simili per generare ogni formato arbitario per il quale puoi trovare una libreria Python. Vedi anche Come creare un output su CSV per altri esempi e qualche tecnica da usare per generare formati basati su testo.

Vedi anche

Django Packages offre una comparazione di package che aiutano a generare file PDF da Django.

Back to Top