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 pada canvas.Canvas. Kelas Canvas kecuali obyek seperti-berkas, dan obyek HttpResponse sesuai dengan tagihan.

  • Catat bahwa semua cara pembangkitan-PDF berikutnya dipanggil pada obyek PDF (dalam kasus ini, p) – bukan pada response.

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

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

Sumberdaya lebih lanjut

  • PDFlib adalah pustaka pembangkitan-PDF lainnya yang mempunyai ikatan Python. Untuk menggunakannya dengan Django, cukup gunakan konsep sama dijelaskan dalam artikel ini.

  • XHTML2PDF adalah pustaka generasi-PDF lainnya. Dia dibungkus denngan sebuah contoh dari bagaimana menggabungkannya dengan Django.

  • HTMLdoc adalah tulisan baris-perintah yang dapat merubah HTML ke PDF. Dia tidak mempunyai antarmuka Python, tetapi anda dapat meloloskan ke shell menggunakan system atau popen dan mengambil keluaran di Python.

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.

Back to Top