2012-03-23 20 views
5

, nesneyi Çizim farklı render içine yazılabilir aracılığı dönmek için Çizim nesnesini kullanarak örneğin Django Reportlab: PDF oluşturmak ve HTTPResponse ReportLab yılında

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

ve Django

, Tuval nesne HttpResponse, örneğin yoluyla gönderilebilir: benim durumumda

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

, benim sorunum ben yerel dosya sistemine kaydeder Çizim nesnesini kullanarak bir reportlab komut dosyası olması. Şimdi onu Django görünümlerine koydum ve yerel dosya sistemine kaydetmenin bir yolu olup olmadığını merak ederek müşteriye geri yolladım.

Umarım bu soruyu açık bir şekilde anlatabilirim.

Önerileriniz için teşekkürler!

güncellemeleri

bir işlev renderPDF orada çıkıyor:

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

verilen tuvalinde çizimi() nesne oluşturmanın.

cevap

2

bu renderPDF bir işlevi olduğu ortaya çıktı.

6

Django'da ReportLab'i diske kaydetmeden kullanmak oldukça kolaydır. Hatta DjangoDocs (https://docs.djangoproject.com/en/dev/howto/outputting-pdf)

Örneklerde, gerçek bir dosya yerine bir "dosya benzeri nesne" kullanarak temelde aşağı doğru kaymaktadır. Çoğu insan bunun için StringIO kullanıyor.

Sen

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

Teşekkürler! ama sanırım sorumu yanlış anladın ya da çok açık söylemedim. Bunu Canvas nesnesini kullanarak nasıl yapacağımı biliyorum, Drawing() nesnesini httpresponse içine koymak için bir yol arıyorum. – Simon

+0

bu yüzden verdiğiniz örneği anlayabiliyorum: d = Çizim (400, 400), ve sonra: pdf = buffer.getvalue() buffer.close() ve son olarak: response.write (pdf)? – Simon

+0

, Drawing() ile çalışmaz. tuval iyi. örneğinizde yazım hatası var: buffer <-> tmp – Simon

0

Çizim böyle 'png', 'gif' veya 'jpg' olarak gerekli çizim biçimini temsil eden bir tek gerekli özniteliği ile asString adlı bir yöntem vardır oldukça basit yapabiliriz. böylece yerine

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

arayarak Sen diske çiziminizi kaydetmek gerek olmadan

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

diyebiliriz. Tam örnek için https://code.djangoproject.com/wiki/Charts numarasını kontrol edin.

renderPDF.draw (çizim, branda, x, y) verilen tuvalinde çizimi() nesne işleyebilen:

İlgili konular