---
title: "Bagaimana membuat berkas PDF"
version: 5.1
locale: id
source: https://docs.djangoproject.com/id/5.1/howto/outputting-pdf/
canonical: https://djangodocs.dev/id/5.1/howto/outputting-pdf/
---
# Bagaimana membuat berkas PDF

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

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](https://www2.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.org/project/reportlab/). A [user guide](https://www.reportlab.com/docs/reportlab-userguide.pdf) (bukan secara kebetulan, berkas PDF) juga tersedia untuk unduh. Anda dapat memasang ReportLab dengan `pip`:

```console
$ python -m pip install reportlab
```

*Windows*

```doscon
...\> py -m pip install reportlab
```

Uji pemasangan anda dengan mengimpor kedalam penterjemah interaktif Python:

```pycon
>>> 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 merasa-seperti obyek.

Ini adalah contoh "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")
```

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

- Tanggapan akan otomatis menyetel jenis MIME `application/pdf` berdasarkan pada ekstensi nama berkas. Ini memberitahu peramban bahwa dokumen adalah berkas PDF, daripada berkas HTML atau isi biner umum `application/octet-stream`.
- Ketika `as_attachment=True` dilewatkan pada `FileResponse`, itu menyetel kepala `Content-Disposition` yang sesuai dan itu memberitahu peramban jaringan untuk memunculkan kotak dialog menunjuk/memastikan bagaimana menangani dokumen bahkan jika sebuah awalan disetel pada mesin. Jika parameter `as_attachment` dihilangkan, peramban akan menangani PDF menggunakan program/plugin apapun mereka telah konfigurasikan untuk menggunakan PDF.
- Anda dapat menyediakan parameter `filename` yang berubah-ubah. Itu akan digunakan oleh peramban dalam dialog "Save as...".
- Anda dapat mengkaitkan kedalam API ReportLab: Wadah sama dilewatkan sebagai argumen pertama pada `canvas.Canvas` bisa diberi makan ke kelas the [`FileResponse`](/id/5.1/ref/request-response/#django.http.FileResponse).
- Catat bahwa semua cara pembangkitan-PDF berikutnya dipanggil pada obyek PDF (dalam kasus ini, `p`) -- bukan pada `buffer`.
- 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.

## 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 [Bagaimana membuat keluaran CSV](/id/5.1/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.
