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.
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 padaFileResponse
, itu menyetel kepalaContent-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 parameteras_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 kelasFileResponse
. - Catat bahwa semua cara pembangkitan-PDF berikutnya dipanggil pada obyek PDF (dalam kasus ini,
p
) -- bukan padabuffer
. - Akhirnya, sangatlah penting memanggil
showPage()
dansave()
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.