Εξάγοντας αρχεία 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 to FileResponse, it sets the appropriate Content-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 the as_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 the FileResponse class.
  • Note that all subsequent PDF-generation methods are called on the PDF object (in this case, p) – not on buffer.
  • Στο τέλος είναι σημαντικό να καλέσετε τις μεθόδους showPage() και save() στο PDF object.

Σημείωση

Η βιβλιοθήκη ReportLab δεν είναι ασφαλής από πολλαπλά threads. Μερικοί από τους χρήστες ανέφεραν κάποια περίεργα προβλήματα όταν πολλοί χρήστες είχαν πρόσβαση, ταυτόχρονα, στα Django views που χρησιμοποιούνταν για να παράξουν PDF αρχεία.

Άλλες μορφές τύπου κειμένου

Όπως είδατε, δεν υπάρχει κάτι συγκεκριμένο με το PDF εδώ – μόνο τα κομμάτια που χρησιμοποιούν τη βιβλιοθήκη reportlab. Μπορείτε να χρησιμοποιήσετε κάποια παρόμοια τεχνική για να εξάγετε οποιαδήποτε μορφή τύπου κειμένου, αρκεί να υπάρχει μια Python βιβλιοθήκη που να την υποστηρίζει. Δείτε στο άρθρο Εξάγοντας αρχεία CSV με το Django για ένα άλλο παράδειγμα και μερικές τεχνικές που μπορείτε να χρησιμοποιήσετε όταν παράγετε αρχεία με μορφή τύπου κειμένου.

Δείτε επίσης

Τα Django Packages παρέχουν συγκριτικό πίνακα μεταξύ των πακέτων ο οποίος βοηθά στη δημιουργία PDF αρχείων από το Django.

Back to Top