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.

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

Pustaka ReportLab adalah available on PyPI. Sebuah user guide (tidak secara kebetulan, sebuah berkas PDF) juga tersedia untuk unduhan. Anda dapat memasang ReportLab dengan pip:

$ pip install reportlab
...\> 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 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 sebuah berkas PDF, daripada sebuah berkas HTML atau isi biner application/octet-stream umum.
  • 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...".
  • Menghubungkan kedalam API ReportLAB adalah mudah: Penyangga sama dilewatkan sebagai argumen pertama pada canvas.Canvas dapat diumpankan ke kelas 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 Mengeluarkan CSV dengan Django 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.

Back to Top