Så här skapar du PDF-filer¶
Detta dokument förklarar hur man dynamiskt kan skriva ut PDF-filer med hjälp av Django-vyer. Detta möjliggörs av det utmärkta PDF-biblioteket ReportLab Python med öppen källkod.
Fördelen med att generera PDF-filer dynamiskt är att du kan skapa anpassade PDF-filer för olika ändamål, t.ex. för olika användare eller olika delar av innehållet.
Till exempel användes Django på kusports.com för att generera anpassade, utskriftsvänliga NCAA-turneringsfästen som PDF-filer för personer som deltog i en March Madness-tävling.
Installera ReportLab¶
ReportLab-biblioteket är tillgängligt på PyPI. En användarhandledning (inte av en tillfällighet en PDF-fil) finns också tillgänglig för nedladdning. Du kan installera ReportLab med pip
:
$ python -m pip install reportlab
...\> py -m pip install reportlab
Testa din installation genom att importera den i Pythons interaktiva tolk:
>>> import reportlab
Om kommandot inte ger några felmeddelanden har installationen fungerat.
Skriv din åsikt¶
Nyckeln till att generera PDF-filer dynamiskt med Django är att ReportLab API agerar på filliknande objekt, och Djangos FileResponse
-objekt accepterar filliknande objekt.
Här är ett exempel på ”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")
Koden och kommentarerna borde vara självförklarande, men det finns några saker som förtjänar att nämnas:
Svaret kommer automatiskt att ställa in MIME-typen application/pdf baserat på filnamnstillägget. Detta talar om för webbläsare att dokumentet är en PDF-fil, snarare än en HTML-fil eller ett generiskt binärt innehåll av typen application/octet-stream.
När
as_attachment=True
skickas tillFileResponse
, anges lämpligContent-Disposition
header och det säger till webbläsare att popa upp en dialogruta som frågar/bekräftar hur dokumentet ska hanteras även om en standard är inställd på maskinen. Om parameternas_attachment
utelämnas kommer webbläsarna att hantera PDF-filen med hjälp av det program/plugin som de har konfigurerats för att använda för PDF-filer.Du kan ange en godtycklig parameter för
filnamn
. Den kommer att användas av webbläsare i dialogrutan ”Spara som…”.Du kan koppla in dig på ReportLab API: Samma buffert som skickas som det första argumentet till
canvas.Canvas
kan matas tillFileResponse
-klassen.Observera att alla efterföljande PDF-genereringsmetoder anropas på PDF-objektet (i detta fall
p
) - inte påbuffer
.Slutligen är det viktigt att anropa
showPage()
ochsave()
på PDF-filen.
Observera
ReportLab är inte trådsäkert. Några av våra användare har rapporterat konstiga problem med att bygga PDF-genererande Django-vyer som nås av många personer samtidigt.
Andra format¶
Lägg märke till att det inte finns mycket i dessa exempel som är PDF-specifikt - bara de delar som använder reportlab
. Du kan använda en liknande teknik för att generera vilket godtyckligt format som helst som du kan hitta ett Python-bibliotek för. Se även Hur man skapar CSV-utdata för ett annat exempel och några tekniker som du kan använda när du genererar textbaserade format.
Se även
Django Packages ger en jämförelse av paket <https://djangopackages.org/grids/g/pdf/>`_ som hjälper till att generera PDF-filer från Django.