2012-03-23 16 views
5

En ReportLab, objeto de dibujo se puede escribir en distintos procesadores, por ejemploDjango ReportLab: de acuerdo al objeto de dibujo para crear PDF y volver a través de HTTPResponse

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

y en Django, objeto Canvas se puede enviar por HttpResponse, por ejemplo:

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

en mi caso, mi problema es que tengo un script usando ReportLab objeto de dibujo que ahorra al sistema de archivos local. Ahora lo pongo en las vistas de Django, y me pregunto si hay una manera de no guardar en el sistema de archivos local, sino que se lo devuelvo al cliente.

Espero que describa esta pregunta con claridad.

¡Gracias por cualquier consejo!

actualizaciones

resulta que hay una función en renderPDF:

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

que puede hacer que el objeto de dibujo() en el lienzo dado.

Respuesta

2

resulta que hay una función en renderPDF:

renderPDF.draw (dibujo, lona, ​​x, y) que puede hacer que el objeto de dibujo() en el lienzo dado.

6

Usar ReportLab en Django sin guardar en el disco es realmente bastante fácil. Incluso hay ejemplos en DjangoDocs (https://docs.djangoproject.com/en/dev/howto/outputting-pdf)

El truco básicamente se reduce a utilizar un "archivo como objeto" en lugar de un archivo real. La mayoría de las personas usa StringIO para esto.

Usted podría hacer que sea muy simple 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

gracias! pero creo que malinterpretaste mi pregunta, o no dije muy claramente. Sé cómo hacer esto utilizando el objeto Canvas, estoy buscando una forma de poner el objeto Drawing() en httpresponse. – Simon

+0

entonces, ¿puedo entender la muestra que proporcionó como: d = Dibujo (400, 400) y luego: pdf = buffer.getvalue() buffer.close(), y finalmente: response.write (pdf)? – Simon

+0

no funciona con Dibujo(). lienzo está bien. en su ejemplo, hay un error tipográfico: buffer <-> tmp – Simon

0

dibujo tiene un método llamado AsString con un atributo requerido que representa el formato de dibujo requerido como 'png', 'gif' o 'jpg'. lo que en lugar de llamar a

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

Se podría llamar

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

Sin la necesidad de guardar el dibujo en el disco.

Compruebe https://code.djangoproject.com/wiki/Charts para un ejemplo completo.

Cuestiones relacionadas