# Django 6.0.5 documentation

# 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 till `FileResponse`, anges lämplig `Content-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 parametern `as_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 till `FileResponse`-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()` och `save()` 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.