{"title":"Så här skapar du PDF-filer","version":"5.2","locale":"sv","docname":"howto/outputting-pdf","url":"/sv/5.2/howto/outputting-pdf/","canonical":"https://djangodocs.dev/sv/5.2/howto/outputting-pdf/","summary":"Detta dokument förklarar hur man dynamiskt kan skriva ut PDF-filer med hjälp av Django-vyer.","html":"<h1>Så här skapar du PDF-filer<a class=\"heading-anchor\" href=\"#how-to-create-pdf-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>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 <a class=\"reference external\" href=\"https://docs.reportlab.com/\">ReportLab</a> Python med öppen källkod.</p>\n<p>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.</p>\n<p>Till exempel användes Django på <a class=\"reference external\" href=\"https://www2.kusports.com/\">kusports.com</a> för att generera anpassade, utskriftsvänliga NCAA-turneringsfästen som PDF-filer för personer som deltog i en March Madness-tävling.</p>\n<section id=\"install-reportlab\">\n<h2>Installera ReportLab<a class=\"heading-anchor\" href=\"#install-reportlab\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ReportLab-biblioteket är <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/reportlab/\">tillgängligt på PyPI</a>. En <a class=\"reference external\" href=\"https://www.reportlab.com/docs/reportlab-userguide.pdf\">användarhandledning</a> (inte av en tillfällighet en PDF-fil) finns också tillgänglig för nedladdning. Du kan installera ReportLab med <code class=\"docutils literal notranslate\">pip</code>:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python -m pip install reportlab\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m pip install reportlab\n</code></pre></div></div></div>\n<p>Testa din installation genom att importera den i Pythons interaktiva tolk:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span> <span class=\"nn\">reportlab</span>\n</code></pre></div>\n<p>Om kommandot inte ger några felmeddelanden har installationen fungerat.</p>\n</section>\n<section id=\"write-your-view\">\n<h2>Skriv din åsikt<a class=\"heading-anchor\" href=\"#write-your-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Nyckeln till att generera PDF-filer dynamiskt med Django är att ReportLab API agerar på filliknande objekt, och Djangos <a class=\"reference internal\" href=\"/sv/5.2/ref/request-response/#django.http.FileResponse\" title=\"django.http.FileResponse\"><code class=\"xref py py-class docutils literal notranslate\">FileResponse</code></a>-objekt accepterar filliknande objekt.</p>\n<p>Här är ett exempel på ”Hello World”:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span> <span class=\"nn\">io</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> FileResponse\n<span class=\"kn\">from</span> <span class=\"nn\">reportlab.pdfgen</span> <span class=\"kn\">import</span> canvas\n\n\n<span class=\"k\">def</span> <span class=\"nf\">some_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"c1\"># Create a file-like buffer to receive PDF data.</span>\n    buffer <span class=\"o\">=</span> io<span class=\"o\">.</span>BytesIO<span class=\"p\">()</span>\n\n    <span class=\"c1\"># Create the PDF object, using the buffer as its &quot;file.&quot;</span>\n    p <span class=\"o\">=</span> canvas<span class=\"o\">.</span>Canvas<span class=\"p\">(</span>buffer<span class=\"p\">)</span>\n\n    <span class=\"c1\"># Draw things on the PDF. Here&#39;s where the PDF generation happens.</span>\n    <span class=\"c1\"># See the ReportLab documentation for the full list of functionality.</span>\n    p<span class=\"o\">.</span>drawString<span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">,</span> <span class=\"mi\">100</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Hello world.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Close the PDF object cleanly, and we&#39;re done.</span>\n    p<span class=\"o\">.</span>showPage<span class=\"p\">()</span>\n    p<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n    <span class=\"c1\"># FileResponse sets the Content-Disposition header so that browsers</span>\n    <span class=\"c1\"># present the option to save the file.</span>\n    buffer<span class=\"o\">.</span>seek<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> FileResponse<span class=\"p\">(</span>buffer<span class=\"p\">,</span> as_attachment<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> filename<span class=\"o\">=</span><span class=\"s2\">&quot;hello.pdf&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Koden och kommentarerna borde vara självförklarande, men det finns några saker som förtjänar att nämnas:</p>\n<ul class=\"simple\">\n<li><p>Svaret kommer automatiskt att ställa in MIME-typen <em class=\"mimetype\">application/pdf</em> 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 <em class=\"mimetype\">application/octet-stream</em>.</p></li>\n<li><p>När <code class=\"docutils literal notranslate\">as_attachment=True</code> skickas till <code class=\"docutils literal notranslate\">FileResponse</code>, anges lämplig <code class=\"docutils literal notranslate\">Content-Disposition</code> 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 <code class=\"docutils literal notranslate\">as_attachment</code> 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.</p></li>\n<li><p>Du kan ange en godtycklig parameter för <code class=\"docutils literal notranslate\">filnamn</code>. Den kommer att användas av webbläsare i dialogrutan ”Spara som…”.</p></li>\n<li><p>Du kan koppla in dig på ReportLab API: Samma buffert som skickas som det första argumentet till <code class=\"docutils literal notranslate\">canvas.Canvas</code> kan matas till <a class=\"reference internal\" href=\"/sv/5.2/ref/request-response/#django.http.FileResponse\" title=\"django.http.FileResponse\"><code class=\"xref py py-class docutils literal notranslate\">FileResponse</code></a>-klassen.</p></li>\n<li><p>Observera att alla efterföljande PDF-genereringsmetoder anropas på PDF-objektet (i detta fall <code class=\"docutils literal notranslate\">p</code>) - inte på <code class=\"docutils literal notranslate\">buffer</code>.</p></li>\n<li><p>Slutligen är det viktigt att anropa <code class=\"docutils literal notranslate\">showPage()</code> och <code class=\"docutils literal notranslate\">save()</code> på PDF-filen.</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>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.</p>\n</aside>\n</section>\n<section id=\"other-formats\">\n<h2>Andra format<a class=\"heading-anchor\" href=\"#other-formats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lägg märke till att det inte finns mycket i dessa exempel som är PDF-specifikt - bara de delar som använder <code class=\"docutils literal notranslate\">reportlab</code>. 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 <a class=\"reference internal\" href=\"/sv/5.2/howto/outputting-csv/\"><span class=\"doc\">Hur man skapar CSV-utdata</span></a> för ett annat exempel och några tekniker som du kan använda när du genererar textbaserade format.</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">Se även</p>\n<p>Django Packages ger en jämförelse av paket &lt;<a class=\"reference external\" href=\"https://djangopackages.org/grids/g/pdf/\">https://djangopackages.org/grids/g/pdf/</a>&gt;`_ som hjälper till att generera PDF-filer från Django.</p>\n</aside>\n</section>","rootId":"how-to-create-pdf-files","toc":[{"title":"Installera ReportLab","anchor":"install-reportlab","children":[]},{"title":"Skriv din åsikt","anchor":"write-your-view","children":[]},{"title":"Andra format","anchor":"other-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"Hur man gör-guider","url":"/sv/5.2/howto/"}],"prev":{"docname":"howto/outputting-csv","title":"Hur man skapar CSV-utdata","url":"/sv/5.2/howto/outputting-csv/"},"next":{"docname":"howto/overriding-templates","title":"Hur man åsidosätter mallar","url":"/sv/5.2/howto/overriding-templates/"},"formats":{"html":"/sv/5.2/howto/outputting-pdf/","markdown":"/sv/5.2/howto/outputting-pdf.md","json":"/sv/5.2/howto/outputting-pdf.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/howto/outputting-pdf.txt","official":"https://docs.djangoproject.com/sv/5.2/howto/outputting-pdf/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}