{"title":"Mengeluarkan PDF dengan Django","version":"2.0","locale":"id","docname":"howto/outputting-pdf","url":"/id/2.0/howto/outputting-pdf/","canonical":"https://djangodocs.dev/id/2.0/howto/outputting-pdf/","summary":"Dokumen ini menjelaskan bagaimana mengeluarkan berkas-berkas PDF secara dinamis menggunakan tampilan Django. Ini dibuat mungkin oleh istimewa, sumber terbuka…","html":"<h1>Mengeluarkan PDF dengan Django<a class=\"heading-anchor\" href=\"#outputting-pdfs-with-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Dokumen ini menjelaskan bagaimana mengeluarkan berkas-berkas PDF secara dinamis menggunakan tampilan Django. Ini dibuat mungkin oleh istimewa, sumber terbuka pustaka PDF Python <a class=\"reference external\" href=\"https://www.reportlab.com/opensource/\">ReportLab</a>.</p>\n<p>Keuntungan dari membangkitkan berkas-berkas PDF secara dinamis adalah bahwa anda dapat membuat penyesuaian PDF untuk tujuan berbeda -- katakan, untuk pengguna berbeda atau potongan berbeda dari isi.</p>\n<p>Sebagai contoh, Django telah digunakan pada <a class=\"reference external\" href=\"http://www.kusports.com/\">kusports.com</a> untuk membangkitkan penyesuaian, kurung turnamen NCAA ramah-mencetak, sebagai berkas-berkas PDF, untuk orang yang ikut serta di perlombaan March Madness.</p>\n<section id=\"install-reportlab\">\n<h2>Pasang 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>Pustaka ReportLab adalah <a class=\"reference external\" href=\"https://pypi.org/project/reportlab/\">available on PyPI</a>. Sebuah <a class=\"reference external\" href=\"https://www.reportlab.com/docs/reportlab-userguide.pdf\">user guide</a> (tidak secara kebetulan, sebuah berkas PDF) juga tersedia untuk unduhan. Anda dapat memasang ReportLab dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code>:</p>\n<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>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>reportlab\n</code></pre></div>\n<p>Ujikan pemasangan anda dengan mengimpornya dalam penterjemah interaktif Python:</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=\"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>Jika perintah itu tidak menimbulkan kesalahan apapun, pemasangan bekerja.</p>\n</section>\n<section id=\"write-your-view\">\n<h2>Tulis tampilan anda<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>Kunci untuk membangkitkan PDF secara dinamis dengan Django adalah bahwa API ReportLab bertindak pada obyek seperti-berkas, dan obyek <a class=\"reference internal\" href=\"/id/2.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> Django adalah obyek seperti-berkas.</p>\n<p>Ini adalah contoh &quot;Hello World&quot;</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\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</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<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 the HttpResponse object with the appropriate PDF headers.</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s1\">&#39;application/pdf&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">response</span><span class=\"p\">[</span><span class=\"s1\">&#39;Content-Disposition&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;attachment; filename=&quot;somefilename.pdf&quot;&#39;</span>\n\n    <span class=\"c1\"># Create the PDF object, using the response object 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\">response</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    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Kode dan komentar seharunya sudah cukup jelas, tetapi sedikit hal pantas disebut:</p>\n<ul>\n<li><p>Tanggapan mendapatkan jenis MIME khusus, <em class=\"mimetype\">application/pdf</em>. Ini memberitahu perambah bahwa dokumen adalah sebuah berkas PDF, daripada sebuah berkas HTML. Jika anda mengosongkan ini, perambah akan kemungkinan pentafsirkan keluaran sebagai HTML, yang akan menghasilkan buruk, uraian berbelit-belit yang menakutkan dalam jendela perambah.</p></li>\n<li><p>Tanggapan mendapatkan sebuah tambahan kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Disposition</span></code>, yang mengandung nama dari berkas PDF. Nama berkas ini berubah-ubah: Panggil dia kapanpun anda ingin. Dia akan digunakan oleh perambah dalam dialog &quot;Save as...&quot;, dll.</p></li>\n<li><p>Kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Disposition</span></code> dimulai dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">'attachment;</span> <span class=\"pre\">'</span></code> dalam contoh ini. Ini memaksa perambah Jaringan memunculkan kotak dialog menunjuk/memastikan bagaimana menangani dokumen bahkan jika nilai awal disetel pada mesin. Jika anda meninggalkan <code class=\"docutils literal notranslate\"><span class=\"pre\">'attachment;</span> <span class=\"pre\">'</span></code>, perambah akan menangani PDF menggunakan program/tambahan apapun mereka telah konfigurasikan digunakan untuk PDF. Ini adalah apa kode kelihatan seperti:</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=\"n\">response</span><span class=\"p\">[</span><span class=\"s1\">&#39;Content-Disposition&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;filename=&quot;somefilename.pdf&quot;&#39;</span>\n</code></pre></div>\n</li>\n<li><p>Mengaitkan kedalam API ReportLab adalah mudah: Cukup lewatkan <code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code> sebagai argumen pertama pada <code class=\"docutils literal notranslate\"><span class=\"pre\">canvas.Canvas</span></code>. Kelas <code class=\"docutils literal notranslate\"><span class=\"pre\">Canvas</span></code> kecuali obyek seperti-berkas, dan obyek <a class=\"reference internal\" href=\"/id/2.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> sesuai dengan tagihan.</p></li>\n<li><p>Catat bahwa semua cara pembangkitan-PDF berikutnya dipanggil pada obyek PDF (dalam kasus ini, <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code>) -- bukan pada <code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code>.</p></li>\n<li><p>Akhirnya, sangatlah penting memanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">showPage()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> pada berkas PDF.</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>ReportLab tidak thread-safe. Beberapa dari pengguna kami telah melaporkan masalah-masalah ganjil dengan membangun tampilan Django pembangkitan-PDF yang diakses oleh banyak orang pada waktu yang sama.</p>\n</aside>\n</section>\n<section id=\"complex-pdfs\">\n<h2>PDF rumit<a class=\"heading-anchor\" href=\"#complex-pdfs\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Jika anda sedang membuat dokumen PDF rumit dengan ReportLab, pertimbangkan menggunakan pustaka <a class=\"reference external\" href=\"https://docs.python.org/3/library/io.html#module-io\" title=\"(di Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">io</span></code></a> sebagai tempat menampung sementara untu berkas PDF anda. Pustaka ini menyediakan antarmuka obyek seperti-berkas yang khususnya efisien. Ini adalah contoh &quot;Hello World&quot; diatas ditulis kembali untuk menggunakan <a class=\"reference external\" href=\"https://docs.python.org/3/library/io.html#module-io\" title=\"(di Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">io</span></code></a>:</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\">from</span><span class=\"w\"> </span><span class=\"nn\">io</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BytesIO</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<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\">HttpResponse</span>\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 the HttpResponse object with the appropriate PDF headers.</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s1\">&#39;application/pdf&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">response</span><span class=\"p\">[</span><span class=\"s1\">&#39;Content-Disposition&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;attachment; filename=&quot;somefilename.pdf&quot;&#39;</span>\n\n    <span class=\"n\">buffer</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 BytesIO object 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.</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\"># Get the value of the BytesIO buffer and write it to the response.</span>\n    <span class=\"n\">pdf</span> <span class=\"o\">=</span> <span class=\"n\">buffer</span><span class=\"o\">.</span><span class=\"n\">getvalue</span><span class=\"p\">()</span>\n    <span class=\"n\">buffer</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">pdf</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n</section>\n<section id=\"other-formats\">\n<h2>Bentuk lain<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>Perhatikan bahwa tidak ada banyak di contoh ini yaitu spesifik-PDF -- cukup bit menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">reportlab</span></code>. Anda dapat menggunakan teknik mirip untuk membangkitkan bentuk berubah-ubah yang anda dapat temukan pustaka Python. Juga lihat <a class=\"reference internal\" href=\"/id/2.0/howto/outputting-csv/\"><span class=\"doc\">Mengeluarkan CSV dengan Django</span></a> untuk contoh lainnya dan beberapa teknik anda dapat gunakan ketika membangkitkan bentuk berbasis-teks.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Lihat juga</p>\n<p>Paket Django menyediakan <a class=\"reference external\" href=\"https://djangopackages.org/grids/g/pdf/\">comparison of packages</a> yang membantu membangkitkan berkas PDF dari Django.</p>\n</aside>\n</section>","rootId":"outputting-pdfs-with-django","toc":[{"title":"Pasang ReportLab","anchor":"install-reportlab","children":[]},{"title":"Tulis tampilan anda","anchor":"write-your-view","children":[]},{"title":"PDF rumit","anchor":"complex-pdfs","children":[]},{"title":"Bentuk lain","anchor":"other-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"Panduan \"Bagaimana\"","url":"/id/2.0/howto/"}],"prev":{"docname":"howto/outputting-csv","title":"Mengeluarkan CSV dengan Django","url":"/id/2.0/howto/outputting-csv/"},"next":{"docname":"howto/overriding-templates","title":"Menimpa cetakan","url":"/id/2.0/howto/overriding-templates/"},"formats":{"html":"/id/2.0/howto/outputting-pdf/","markdown":"/id/2.0/howto/outputting-pdf.md","json":"/id/2.0/howto/outputting-pdf.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/howto/outputting-pdf.txt","official":"https://docs.djangoproject.com/id/2.0/howto/outputting-pdf/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}