Εξάγοντας αρχεία PDF με το Django¶
Αυτό το άρθρο εξηγεί πως να εξάγετε αρχεία PDF, δυναμικά, χρησιμοποιώντας τα Django views. Αυτό είναι εφικτό, με τη χρήση της εξαιρετικής, ανοιχτού λογισμικου PDF βιβλιοθήκης της Python, ReportLab.
Το πλεονέκτημα της παραγωγής δυναμικών αρχείων PDF είναι ότι μπορείτε να δημιουργείτε παραμετροποιήσιμα PDFs για διαφορετικούς σκοπούς – πχ, για διαφορετικούς χρήστες ή διαφορετικά κομμάτια δεδομένων.
Για παράδειγμα, το Django χρησιμοποιήθηκε στο kusports.com για να παράγει παραμετροποιήσιμα, φιλικά προς εκτύπωση αποτελέσματα αγώνων μπάσκετ (NCAA tournament brackets), ως αρχεία PDF, για αυτούς που συμμετέχουν στον διαγωνισμό March Madness.
Εγκατάσταση της βιβλιοθήκης ReportLab¶
Η βιβλιοθήκη ReportLab είναι διαθέσιμη στο PyPI. Ένας οδηγός χρήστη (όχι τυχαία, ένα PDF αρχείο) είναι επίσης διαθέσιμο για download. Μπορείτε να εγκαταστήσετε το ReportLab με το pip
:
$ pip install reportlab
...\> pip install reportlab
Ελέγξτε την εγκατάσταση της βιβλιοθήκης κάνοντας την import στο Python interactive shell σας (αν την έχετε εγκαταστήσει globally, τότε σε κονσόλα γράψτε πρώτα python
ή python3.x
όπου x
η έκδοση Python που χρησιμοποιείτε):
>>> import reportlab
Αν αυτό δεν σας εμφανίσει κάποιο σφάλμα, η βιβλιοθήκη έχει εγκατασταθεί επιτυχώς.
Γράψτε το view¶
The key to generating PDFs dynamically with Django is that the ReportLab API
acts on file-like objects, and Django’s FileResponse
objects accept file-like objects.
Εδώ φαίνεται το κλασικό παράδειγμα «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')
Παρόλο που ο κώδικας και τα σχόλια είναι αρκετά επεξηγηματικά, θα πρέπει να αναφέρουμε μερικά πράγματα:
- The response will automatically set the MIME type application/pdf based on the filename extension. This tells browsers that the document is a PDF file, rather than an HTML file or a generic application/octet-stream binary content.
- When
as_attachment=True
is passed toFileResponse
, it sets the appropriateContent-Disposition
header and that tells Web browsers to pop-up a dialog box prompting/confirming how to handle the document even if a default is set on the machine. If theas_attachment
parameter is omitted, browsers will handle the PDF using whatever program/plugin they’ve been configured to use for PDFs. - You can provide an arbitrary
filename
parameter. It’ll be used by browsers in the «Save as…» dialog. - Hooking into the ReportLab API is easy: The same buffer passed as the first
argument to
canvas.Canvas
can be fed to theFileResponse
class. - Note that all subsequent PDF-generation methods are called on the PDF
object (in this case,
p
) – not onbuffer
. - Στο τέλος είναι σημαντικό να καλέσετε τις μεθόδους
showPage()
καιsave()
στο PDF object.
Σημείωση
Η βιβλιοθήκη ReportLab δεν είναι ασφαλής από πολλαπλά threads. Μερικοί από τους χρήστες ανέφεραν κάποια περίεργα προβλήματα όταν πολλοί χρήστες είχαν πρόσβαση, ταυτόχρονα, στα Django views που χρησιμοποιούνταν για να παράξουν PDF αρχεία.
Άλλες μορφές τύπου κειμένου¶
Όπως είδατε, δεν υπάρχει κάτι συγκεκριμένο με το PDF εδώ – μόνο τα κομμάτια που χρησιμοποιούν τη βιβλιοθήκη reportlab
. Μπορείτε να χρησιμοποιήσετε κάποια παρόμοια τεχνική για να εξάγετε οποιαδήποτε μορφή τύπου κειμένου, αρκεί να υπάρχει μια Python βιβλιοθήκη που να την υποστηρίζει. Δείτε στο άρθρο Εξάγοντας αρχεία CSV με το Django για ένα άλλο παράδειγμα και μερικές τεχνικές που μπορείτε να χρησιμοποιήσετε όταν παράγετε αρχεία με μορφή τύπου κειμένου.
Δείτε επίσης
Τα Django Packages παρέχουν συγκριτικό πίνακα μεταξύ των πακέτων ο οποίος βοηθά στη δημιουργία PDF αρχείων από το Django.