2012-03-23 46 views
5

在ReportLab的,圖形對象可以被寫入不同的渲染器返回,例如Django的ReportLab的:使用圖形對象來創建PDF和經由的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(拉絲,帆布,X,Y) 可以在給定的畫布渲染繪製()對象。

6

在Django中使用ReportLab而不保存到磁盤其實很簡單。甚至有DjangoDocs中的例子(https://docs.djangoproject.com/en/dev/howto/outputting-pdf

技巧基本上歸結爲使用「像文件一樣的對象」而不是實際的文件。大多數人爲此使用StringIO。

您可以用

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

謝謝!但我認爲你誤解了我的問題,或者我沒有說得很清楚。我知道如何使用Canvas對象執行此操作,我正在尋找一種將Drawing()對象放入httpresponse中的方法。 – Simon 2012-03-24 05:20:01

+0

所以我可以理解你給的例子:d = Drawing(400,400),然後:pdf = buffer.getvalue()buffer.close(),最後是:response.write(pdf)? – Simon 2012-03-24 05:21:26

+0

它不適用於Drawing()。帆布很好。在你的例子中,有一個錯字:buffer <-> tmp – Simon 2012-03-24 05:34:12

0

繪畫有一個叫與代表所需的圖形格式,如「PNG」,「GIF」或「JPG」一個必需屬性asString方法做到這一點倒也乾脆。 因此而不是調用

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

你可以稱之爲

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

而不需要到圖形保存到光盤上。

查看完整示例的https://code.djangoproject.com/wiki/Charts

相關問題