Django 2.1 - Outputting PDFs with Django

Django के साथ आउटपुट पीडीएफ




django

Django के साथ आउटपुट पीडीएफ

यह दस्तावेज़ बताता है कि कैसे Django दृश्यों का उपयोग करके पीडीएफ फाइलों को गतिशील रूप से आउटपुट किया जाता है। यह उत्कृष्ट, ओपन-सोर्स ReportLab पायथन पीडीएफ लाइब्रेरी द्वारा संभव है।

गतिशील रूप से पीडीएफ फाइलों को जनरेट करने का लाभ यह है कि आप अलग-अलग उपयोगकर्ताओं या सामग्री के अलग-अलग टुकड़ों के लिए अलग-अलग उद्देश्यों के लिए अनुकूलित पीडीएफ बना सकते हैं।

उदाहरण के लिए, Django का उपयोग kusports.com में किया गया था, जो एक मार्च पागलपन प्रतियोगिता में भाग लेने वाले लोगों के लिए, PDF के रूप में, प्रिंटर के अनुकूल NCAA टूर्नामेंट कोष्ठक को अनुकूलित करने के लिए kusports.com गया था।

रिपोर्टलैब स्थापित करें

ReportLab लाइब्रेरी PyPI पर उपलब्ध है । एक उपयोगकर्ता गाइड (संयोग से नहीं, एक पीडीएफ फाइल) डाउनलोड के लिए भी उपलब्ध है। आप पाइप के साथ ReportLab स्थापित कर सकते हैं:

$ pip install reportlab
...\> pip install reportlab

पायथन इंटरएक्टिव दुभाषिया में आयात करके अपनी स्थापना का परीक्षण करें:

>>> import reportlab

यदि वह कमांड किसी भी त्रुटि को नहीं बढ़ाता है, तो स्थापना ने काम किया है।

अपना विचार लिखें

Django के साथ PDF को गतिशील रूप से जनरेट करने की कुंजी यह है कि ReportLab API फ़ाइल जैसी वस्तुओं पर कार्य करता है, और Django के FileResponse ऑब्जेक्ट फ़ाइल जैसी वस्तुओं को स्वीकार करते हैं।

यहाँ एक "हैलो वर्ल्ड" उदाहरण है:

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')

कोड और टिप्पणियां स्व-व्याख्यात्मक होनी चाहिए, लेकिन कुछ चीजें एक उल्लेख के लायक हैं:

  • प्रतिक्रिया स्वचालित रूप से फ़ाइल नाम एक्सटेंशन के आधार पर MIME टाइप एप्लिकेशन / पीडीएफ सेट करेगी। यह ब्राउज़रों को बताता है कि दस्तावेज़ एक पीडीएफ फाइल है, बजाय एक HTML फ़ाइल या एक जेनेरिक application/octet-stream बाइनरी सामग्री के।
  • जब as_attachment=True को FileResponse पास किया FileResponse , तो यह उचित Content-Disposition FileResponse शीर्षक सेट करता है और जो वेब ब्राउज़र को एक डायलॉग बॉक्स को पॉप-अप करने के लिए कहता है / पुष्टि करता है कि मशीन पर डिफ़ॉल्ट सेट होने पर भी दस्तावेज़ को कैसे संभालना है। यदि as_attachment पैरामीटर को छोड़ दिया गया है, तो ब्राउज़र पीडीएफ के लिए उपयोग करने के लिए जो भी प्रोग्राम / प्लगइन कॉन्फ़िगर किया गया है, उसका उपयोग करके पीडीएफ को संभालेंगे।
  • आप एक मनमाने filename पैरामीटर प्रदान कर सकते हैं। यह "इस रूप में सहेजें ..." संवाद में ब्राउज़र द्वारा उपयोग किया जाएगा।
  • रिपोर्टलैब एपीआई में हुकिंग आसान है: एक ही बफर को canvas.Canvas के पहले तर्क के रूप में पारित किया गया है। FileResponse को FileResponse क्लास में खिलाया जा सकता है।
  • ध्यान दें कि सभी बाद की पीडीएफ-पीढ़ी के तरीकों को पीडीएफ ऑब्जेक्ट पर बुलाया जाता है (इस मामले में, p ) - buffer पर नहीं।
  • अंत में, पीडीएफ फाइल पर showPage() और save() को कॉल करना महत्वपूर्ण है।

ध्यान दें

ReportLab थ्रेड-सुरक्षित नहीं है। हमारे कुछ उपयोगकर्ताओं ने पीडीएफ-जनरेट करने वाले Django दृश्यों के निर्माण के साथ अजीब मुद्दों की सूचना दी है जो एक ही समय में कई लोगों द्वारा एक्सेस किए जाते हैं।

अन्य प्रारूप

ध्यान दें कि इन उदाहरणों में बहुत कुछ नहीं है जो पीडीएफ-विशिष्ट हैं - बस reportlab का उपयोग करके बिट्स। आप किसी भी मनमाने प्रारूप को उत्पन्न करने के लिए इसी तरह की तकनीक का उपयोग कर सकते हैं जिसके लिए आप पायथन लाइब्रेरी पा सकते हैं। एक अन्य उदाहरण के लिए DjV के साथ सीएसवी आउटपुट आउटपुट भी देखें और कुछ तकनीकों का उपयोग करें जो आप पाठ-आधारित प्रारूप उत्पन्न करते समय उपयोग कर सकते हैं।

यह भी देखें

Django पैकेज, पैकेज की तुलना प्रदान करता है जो Django से पीडीएफ फाइलों को उत्पन्न करने में मदद करता है।