---
title: "Mengeluarkan PDF dengan Django"
version: 1.11
locale: id
source: https://docs.djangoproject.com/id/1.11/howto/outputting-pdf/
canonical: https://djangodocs.dev/id/1.11/howto/outputting-pdf/
---
# Mengeluarkan PDF dengan Django

Dokumen ini menjelaskan bagaimana mengeluarkan berkas-berkas PDF secara dinamis menggunakan tampilan Django. Ini dibuat mungkin oleh istimewa, sumber terbuka pustaka PDF Python [ReportLab](http://www.reportlab.com/opensource/).

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.

Sebagai contoh, Django telah digunakan pada [kusports.com](http://www.kusports.com/) untuk membangkitkan penyesuaian, kurung turnamen NCAA ramah-mencetak, sebagai berkas-berkas PDF, untuk orang yang ikut serta di perlombaan March Madness.

## Pasang ReportLab

Pustaka ReportLab adalah [available on PyPI](https://pypi.python.org/pypi/reportlab). Sebuah [user guide](http://www.reportlab.com/docs/reportlab-userguide.pdf) (tidak secara kebetulan, sebuah berkas PDF) juga tersedia untuk unduhan. Anda dapat memasang ReportLab dengan `pip`:

```console
$ pip install reportlab
```

Ujikan pemasangan anda dengan mengimpornya dalam penterjemah interaktif Python:

```
>>> import reportlab
```

Jika perintah itu tidak menimbulkan kesalahan apapun, pemasangan bekerja.

## Tulis tampilan anda

Kunci untuk membangkitkan PDF secara dinamis dengan Django adalah bahwa API ReportLab bertindak pada obyek seperti-berkas, dan obyek [`HttpResponse`](/id/1.11/ref/request-response/#django.http.HttpResponse) Django adalah obyek seperti-berkas.

Ini adalah contoh "Hello World"

```
from reportlab.pdfgen import canvas
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    # Create the PDF object, using the response object as its "file."
    p = canvas.Canvas(response)

    # 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()
    return response
```

Kode dan komentar seharunya sudah cukup jelas, tetapi sedikit hal pantas disebut:

- Tanggapan mendapatkan jenis MIME khusus, `application/pdf`. 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.
- Tanggapan mendapatkan sebuah tambahan kepala `Content-Disposition`, yang mengandung nama dari berkas PDF. Nama berkas ini berubah-ubah: Panggil dia kapanpun anda ingin. Dia akan digunakan oleh perambah dalam dialog "Save as...", dll.
- Kepala `Content-Disposition` dimulai dengan `'attachment; '` 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 `'attachment; '`, perambah akan menangani PDF menggunakan program/tambahan apapun mereka telah konfigurasikan digunakan untuk PDF. Ini adalah apa kode kelihatan seperti:

  ```
  response['Content-Disposition'] = 'filename="somefilename.pdf"'
  ```
- Mengaitkan kedalam API ReportLab adalah mudah: Cukup lewatkan `response` sebagai argumen pertama pada `canvas.Canvas`. Kelas `Canvas` kecuali obyek seperti-berkas, dan obyek [`HttpResponse`](/id/1.11/ref/request-response/#django.http.HttpResponse) sesuai dengan tagihan.
- Catat bahwa semua cara pembangkitan-PDF berikutnya dipanggil pada obyek PDF (dalam kasus ini, `p`) -- bukan pada `response`.
- Akhirnya, sangatlah penting memanggil `showPage()` dan `save()` pada berkas PDF.

> **Note**
>
> 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.

## PDF rumit

Jika anda sedang membuat dokumen PDF rumit dengan ReportLab, pertimbangkan menggunakan pustaka [`io`](https://docs.python.org/3/library/io.html#module-io) sebagai tempat menampung sementara untu berkas PDF anda. Pustaka ini menyediakan antarmuka obyek seperti-berkas yang khususnya efisien. Ini adalah contoh "Hello World" diatas ditulis kembali untuk menggunakan [`io`](https://docs.python.org/3/library/io.html#module-io):

```
from io import BytesIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    buffer = BytesIO()

    # Create the PDF object, using the BytesIO object 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.
    p.showPage()
    p.save()

    # Get the value of the BytesIO buffer and write it to the response.
    pdf = buffer.getvalue()
    buffer.close()
    response.write(pdf)
    return response
```

## Bentuk lain

Perhatikan bahwa tidak ada banyak di contoh ini yaitu spesifik-PDF -- cukup bit menggunakan `reportlab`. Anda dapat menggunakan teknik mirip untuk membangkitkan bentuk berubah-ubah yang anda dapat temukan pustaka Python. Juga lihat [Mengeluarkan CSV dengan Django](/id/1.11/howto/outputting-csv/) untuk contoh lainnya dan beberapa teknik anda dapat gunakan ketika membangkitkan bentuk berbasis-teks.

> **See also**
>
> Paket Django menyediakan [comparison of packages](https://djangopackages.org/grids/g/pdf/) yang membantu membangkitkan berkas PDF dari Django.
