2012-03-23 7 views
5

ReportLab में, ड्राइंग वस्तु विभिन्न दाता में लिखा जा सकता है के माध्यम से वापस जाने के लिए, जैसेDjango ReportLab: आरेखण ऑब्जेक्ट का उपयोग पीडीएफ बना सकते हैं और HttpResponse

d = shapes.Drawing(400, 400) 
renderPDF.drawToFile(d, 'test.pdf') 

और Django में, कैनवास वस्तु HttpResponse, जैसे के माध्यम से भेजा जा सकता है:

response = HttpResponse(mimetype='application/pdf') 
response['Content-Disposition'] = 'filename=test.pdf' 
c = canvas.Canvas(response) 

मेरे मामले में, मेरी समस्या यह है कि मैं एक reportLab स्क्रिप्ट आकर्षित वस्तु जो स्थानीय फाइल सिस्टम को बचाता है का उपयोग कर रहा है। अब मैं इसे Django विचारों में डालता हूं, और सोच रहा हूं कि स्थानीय फाइल सिस्टम में सहेजने का कोई तरीका नहीं है, बल्कि इसके बजाय क्लाइंट को भेजा गया है।

मुझे आशा है कि मैं इस प्रश्न का स्पष्ट रूप से वर्णन करूंगा।

किसी भी सलाह के लिए धन्यवाद!

अपडेट

यह पता चला है वहाँ renderPDF में एक समारोह है:

renderPDF.draw(drawing, canvas, x, y) 

जो ड्राइंग() दिए गए कैनवास में वस्तु प्रदान कर सकते हैं।

उत्तर

2

यह पता चला है वहाँ renderPDF में एक समारोह है:

renderPDF.draw (ड्राइंग, कैनवास, एक्स, वाई) जो दिया कैनवास में ड्राइंग() वस्तु प्रदान कर सकते हैं।

6

डिस्क पर सहेजे बिना Django में ReportLab का उपयोग करना वास्तव में बहुत आसान है। DjangoDocs (https://docs.djangoproject.com/en/dev/howto/outputting-pdf) में भी उदाहरण हैं

चाल मूल रूप से वास्तविक फ़ाइल के बजाय "ऑब्जेक्ट की तरह फ़ाइल" का उपयोग करने के लिए उबलती है। अधिकांश लोग इसके लिए स्ट्रिंगियो का उपयोग करते हैं।

आप

from cStringIO import StringIO 

def some_view(request): 
    filename = 'test.pdf' 

    # Make your response and prep to attach 
    response = HttpResponse(mimetype='application/pdf') 
    response['Content-Disposition'] = 'attachment; filename=%s.pdf' % (filename) 
    tmp = StringIO() 

    # Create a canvas to write on 
    p = canvas.Canvas(tmp) 
    # With someone on 
    p.drawString(100, 100, "Hello world") 

    # Close the PDF object cleanly. 
    p.showPage() 
    p.save() 

    # Get the data out and close the buffer cleanly 
    pdf = tmp.getvalue() 
    tmp.close() 

    # Get StringIO's body and write it out to the response. 
    response.write(pdf) 
    return response 
+0

धन्यवाद! लेकिन मुझे लगता है कि आपने मेरे प्रश्न को गलत समझा, या मैंने बहुत स्पष्ट रूप से नहीं कहा। मुझे पता है कि कैनवास ऑब्जेक्ट का उपयोग करके इसे कैसे किया जाए, मैं httpresponse में Drawing() ऑब्जेक्ट डालने का एक तरीका ढूंढ रहा हूं। – Simon

+0

तो क्या मैं आपके द्वारा दिए गए नमूने को समझ सकता हूं: डी = ड्राइंग (400, 400), और फिर: पीडीएफ = buffer.getvalue() buffer.close(), और अंत में: response.write (पीडीएफ)? – Simon

+0

यह ड्राइंग() के साथ काम नहीं करता है। कैनवास ठीक है। आपके उदाहरण में, एक टाइपो है: बफर <-> tmp – Simon

0

आहरण एक विधि एक एक आवश्यक विशेषता है कि इस तरह 'png', 'gif' या 'जेपीजी' के रूप में आवश्यक ड्राइंग प्रारूप का प्रतिनिधित्व करता है के साथ asString कहा जाता है के साथ सुंदर बस इसे कर सकता है। तो बजाय बुला

renderPDF.drawToFile(d, 'test.pdf') 

आप डिस्क को अपने ड्राइंग सहेजने की आवश्यकता के बिना

binaryStuff = d.asString('gif') 
return HttpResponse(binaryStuff, 'image/gif') 

कह सकते हैं।

पूर्ण उदाहरण के लिए https://code.djangoproject.com/wiki/Charts देखें।

संबंधित मुद्दे