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
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
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 padacanvas.Canvas
. KelasCanvas
kecuali obyek seperti-berkas, dan obyekHttpResponse
sesuai dengan tagihan.Catat bahwa semua cara pembangkitan-PDF berikutnya dipanggil pada obyek PDF (dalam kasus ini,
p
) -- bukan padaresponse
.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.
PDF rumit¶
Jika anda sedang membuat dokumen PDF rumit dengan ReportLab, pertimbangkan menggunakan pustaka 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
:
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 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.