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¶
La libreria ReportLab è disponibile su PyPI. Una guida utente (non incidentalmente, un PDF) è disponibile per il download. Puoi installare ReportLab con pip
:
$ python -m pip install reportlab
...\> py -m pip install reportlab
Testa la tua installazione importandolo nella shell interattiva di Python:
>>> 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 aFileResponse
, imposta l’headerContent-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 parametroas_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 classeFileResponse
. - 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()
esave()
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.