# Dokumentasi Django 4.2.9.dev20231204082947

# 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.

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 untuk membangkitkan penyesuaian, kurung turnamen NCAA ramah-mencetak, sebagai berkas-berkas PDF, untuk orang yang ikut serta di perlombaan March Madness.

## Pasang ReportLab

The ReportLab library is available on PyPI. A user guide (not coincidentally, a PDF file) is also available for download. You can install ReportLab with `pip`:

/ 

    $ python -m pip install reportlab

    ...\> py -m pip install reportlab

Test your installation by importing it in the Python interactive interpreter:

    >>> 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.
- When `as_attachment=True` is passed to `FileResponse`, it sets the appropriate `Content-Disposition` header and that tells web browsers to pop-up a dialog box prompting/confirming how to handle the document even if a default is set on the machine. If the `as_attachment` parameter is omitted, browsers will handle the PDF using whatever program/plugin they've been configured to use for PDFs.
- 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`.
- 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.

Catatan

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 untuk contoh lainnya dan beberapa teknik anda dapat gunakan ketika membangkitkan bentuk berbasis-teks.

Lihat juga

Paket Django menyediakan comparison of packages yang membantu membangkitkan berkas PDF dari Django.