2012-03-23 11 views
5

In ReportLab, Disegno oggetto può essere scritto in diversi renderer, ad esempioDjango ReportLab: utilizzando oggetto di disegno per creare PDF e restituire via HttpResponse

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

e in Django, oggetto Canvas può essere inviato via HttpResponse, ad esempio:

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

nel mio caso, il mio problema è che ho uno script utilizzando ReportLab oggetto di disegno che salva al file system locale. Ora lo metto nelle viste di Django e mi chiedo se esiste un modo per non salvare sul file system locale, ma che invece viene inviato al client.

Spero di descrivere chiaramente questa domanda.

Grazie per qualsiasi consiglio!

aggiornamenti

risulta là è una funzione in renderPDF:

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

che possono rendere disegno) oggetto della proposta tela (.

risposta

2

risulta là è una funzione in renderPDF:

renderPDF.draw (disegno, tela, x, y) che può rendere disegno) oggetto (nel dato tela.

6

L'utilizzo di ReportLab in Django senza salvare su disco è in realtà piuttosto semplice. Esistono anche esempi in DjangoDocs (https://docs.djangoproject.com/en/dev/howto/outputting-pdf)

Il trucco si riduce fondamentalmente all'utilizzo di un "file come oggetto" anziché di un file effettivo. Molte persone usano StringIO per questo.

Si potrebbe fare abbastanza semplicemente con

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

grazie! ma penso che tu abbia frainteso la mia domanda, o non ho detto molto chiaramente. So come farlo usando Canvas object, sto cercando un modo per inserire l'oggetto Drawing() in httpresponse. – Simon

+0

così posso capire l'esempio che hai dato come: d = Disegno (400, 400), e poi: pdf = buffer.getvalue() buffer.close() e infine: response.write (pdf)? – Simon

+0

non funziona con Drawing(). la tela va bene. nel tuo esempio, c'è un errore di battitura: buffer <-> tmp – Simon

0

disegno ha un metodo chiamato AsString con un attributo necessario che rappresenta il formato di disegno necessari come ad esempio 'png', 'gif' o 'jpg'. così invece di chiamare

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

Si può chiamare

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

Senza la necessità di salvare il disegno per il disco.

Controllare https://code.djangoproject.com/wiki/Charts per l'esempio completo.

Problemi correlati