{"title":"Come creare file PDF","version":"5.2","locale":"it","docname":"howto/outputting-pdf","url":"/it/5.2/howto/outputting-pdf/","canonical":"https://djangodocs.dev/it/5.2/howto/outputting-pdf/","summary":"Questo documento spiega come produrre PDF dinamicamente usando le views di Django. Questo è reso possibile dall’eccellente libreria open-source ReportLab Python…","html":"<h1>Come creare file PDF<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>Questo documento spiega come produrre PDF dinamicamente usando le views di Django. Questo è reso possibile dall’eccellente libreria open-source <a class=\"reference external\" href=\"https://docs.reportlab.com/\">ReportLab</a> Python PDF.</p>\n<p>Il vantaggio di generare file PDF dinamicamente è che puoi creare PDF personalizzati per differenti scopi – , per differenti utenti o per differenti parti del contenuto.</p>\n<p>Per esempio, Django è stato usato in <a class=\"reference external\" href=\"https://www2.kusports.com/\">kusports.com</a> per generare bracket di torneo printer-friendly per i tornei NCAA, come file PDF, per le persone che partecipavano alla gara March Madness.</p>\n<section id=\"install-reportlab\">\n<h2>Installa 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>The ReportLab library is <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/reportlab/\">available on PyPI</a>. A <a class=\"reference external\" href=\"https://www.reportlab.com/docs/reportlab-userguide.pdf\">user guide</a>\n(not coincidentally, a PDF file) is also available for download.\nYou can install ReportLab with <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></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<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>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>Test your installation by importing it in the Python interactive interpreter:</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=\"w\"> </span><span class=\"nn\">reportlab</span>\n</code></pre></div>\n<p>Se quel comando non genera nessune errore, l’installazione ha funzionato.</p>\n</section>\n<section id=\"write-your-view\">\n<h2>Scrivi la tua vista<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>La chiave per generare PDF dinamicamente con Django è che le API di ReportLab agiscono su oggetti file-like e l’oggetto di Django <a class=\"reference internal\" href=\"/it/5.2/ref/request-response/#django.http.FileResponse\" title=\"django.http.FileResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileResponse</span></code></a> accetta oggetti file-like.</p>\n<p>Qui un esempio di «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=\"w\"> </span><span class=\"nn\">io</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FileResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">reportlab.pdfgen</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">canvas</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create a file-like buffer to receive PDF data.</span>\n    <span class=\"n\">buffer</span> <span class=\"o\">=</span> <span class=\"n\">io</span><span class=\"o\">.</span><span class=\"n\">BytesIO</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># Create the PDF object, using the buffer as its &quot;file.&quot;</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">canvas</span><span class=\"o\">.</span><span class=\"n\">Canvas</span><span class=\"p\">(</span><span class=\"n\">buffer</span><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    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">drawString</span><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    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">showPage</span><span class=\"p\">()</span>\n    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><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    <span class=\"n\">buffer</span><span class=\"o\">.</span><span class=\"n\">seek</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">FileResponse</span><span class=\"p\">(</span><span class=\"n\">buffer</span><span class=\"p\">,</span> <span class=\"n\">as_attachment</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">filename</span><span class=\"o\">=</span><span class=\"s2\">&quot;hello.pdf&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Il codice ed i commenti dovrebbero essere auto esplicativi, ma alcuni dettagli meritano un approfondimento:</p>\n<ul class=\"simple\">\n<li><p>La risposta imposterà automaticamente il tipo MIME <em class=\"mimetype\">application/pdf</em> basato sull’estensione del file. Questo dice ai browser che il documento è un file PDF, piuttosto che un file HTML o un contenuto binario generico <em class=\"mimetype\">application/octet-stream</em>.</p></li>\n<li><p>Quando <code class=\"docutils literal notranslate\"><span class=\"pre\">as_attachment=True</span></code> viene passato a <code class=\"docutils literal notranslate\"><span class=\"pre\">FileResponse</span></code>, imposta l’header <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Disposition</span></code> appropriato e dice ai browser web di mostrare una finestra di dialogo che richiede/conferma come gestire il documento anche se sulla macchina è impostato un valore predefinito. Se il parametro <code class=\"docutils literal notranslate\"><span class=\"pre\">as_attachment</span></code> viene omesso, i browser gestiranno il PDF utilizzando qualsiasi programma/plugin siano stati configurati ad usare per i PDF.</p></li>\n<li><p>Puoi scegliere un parametro <code class=\"docutils literal notranslate\"><span class=\"pre\">filename</span></code> arbitrario. Verrà utilizzato dai browsers nella finestra di dialogo «Salva come..».</p></li>\n<li><p>È possibile agganciarsi all’API ReportLab: lo stesso buffer è passato come primo argomento alla classe <code class=\"docutils literal notranslate\"><span class=\"pre\">canvas.Canvas</span></code> può alimentare la classe <a class=\"reference internal\" href=\"/it/5.2/ref/request-response/#django.http.FileResponse\" title=\"django.http.FileResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileResponse</span></code></a> .</p></li>\n<li><p>Si noti che tutti i metodi di generazione PDF successivi sono chiamati sull’oggetto PDF (in questo caso, <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code>) – non su `` buffer``.</p></li>\n<li><p>Infine, è importante chiamare <code class=\"docutils literal notranslate\"><span class=\"pre\">showPage()</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> sul file PDF.</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>ReportLab non è thread-safe. Alcuni dei nostri utenti hanno riportato strani problemi con Django view che generano PDF quando vi accedono più persone allo stesso tempo.</p>\n</aside>\n</section>\n<section id=\"other-formats\">\n<h2>Altri formati<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>Nota che non ci sono molti esempi specifici per i PDF – solo alcuni che usano <code class=\"docutils literal notranslate\"><span class=\"pre\">reportlab</span></code>. Puoi usare tecniche simili per generare ogni formato arbitario per il quale puoi trovare una libreria Python. Vedi anche <a class=\"reference internal\" href=\"/it/5.2/howto/outputting-csv/\"><span class=\"doc\">Come creare un output su CSV</span></a> per altri esempi e qualche tecnica da usare per generare formati basati su testo.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Vedi anche</p>\n<p>Django Packages offre una <a class=\"reference external\" href=\"https://djangopackages.org/grids/g/pdf/\">comparazione di package</a> che aiutano a generare file PDF da Django.</p>\n</aside>\n</section>","rootId":"how-to-create-pdf-files","toc":[{"title":"Installa ReportLab","anchor":"install-reportlab","children":[]},{"title":"Scrivi la tua vista","anchor":"write-your-view","children":[]},{"title":"Altri formati","anchor":"other-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/it/5.2/howto/"}],"prev":{"docname":"howto/outputting-csv","title":"Come creare un output su CSV","url":"/it/5.2/howto/outputting-csv/"},"next":{"docname":"howto/overriding-templates","title":"Come sovrascrivere i templates","url":"/it/5.2/howto/overriding-templates/"},"formats":{"html":"/it/5.2/howto/outputting-pdf/","markdown":"/it/5.2/howto/outputting-pdf.md","json":"/it/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/it/5.2/howto/outputting-pdf/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}