Bagaimana membuat berkas PDFLink to this heading

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 ReportLabLink to this heading

Pustaka ReportLab adalah available on PyPI. A user guide (bukan secara kebetulan, berkas PDF) juga tersedia untuk unduh. Anda dapat memasang ReportLab dengan pip:

Linux / macOS

Shell
$ python -m pip install reportlab

Windows

Windows
...\> py -m pip install reportlab

Uji pemasangan anda dengan mengimpor kedalam penterjemah interaktif Python:

Python console
>>> import reportlab

Jika perintah itu tidak menimbulkan kesalahan apapun, pemasangan bekerja.

Tulis tampilan andaLink to this heading

Kunci untuk membangkitkan PDF secara dinamis dengan Django adalah bahwa API ReportLab bertindak pada merasa-seperti obyek.

Ini adalah contoh "Hello World"

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

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

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

Bentuk lainLink to this heading

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.