Django ReportLab: использование объекта Drawing для создания PDF и возврата через Httpresponse - PullRequest
6 голосов
/ 24 марта 2012

В ReportLab рисованный объект может быть записан в различные средства визуализации, например,

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

, а в Django объект Canvas может быть отправлен по httpresponse, например:

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

вВ этом случае моя проблема заключается в том, что у меня есть скрипт reportLab, использующий объект Drawing, который сохраняет в локальной файловой системе.Теперь я помещаю его в представления Django и задаюсь вопросом, есть ли способ не сохранить в локальной файловой системе, а вместо этого отправить обратно клиенту.

Надеюсь, я четко опишу этот вопрос.

Спасибоза любой совет!

обновления

Оказывается, в renderPDF есть функция:

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

, которая может визуализировать объект Drawing () вданный холст.

Ответы [ 3 ]

6 голосов
/ 24 марта 2012

Использование ReportLab в Django без сохранения на диск на самом деле довольно просто.В 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
2 голосов
/ 03 апреля 2012

Оказывается, в renderPDF есть функция:

renderPDF.draw (Drawing, canvas, x, y), которая может визуализировать объект Drawing () на данном холсте.

1 голос
/ 25 марта 2012

В чертеже есть метод asString с одним обязательным атрибутом, который представляет необходимый формат чертежа, такой как «png», «gif» или «jpg».поэтому вместо вызова

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

Вы можете позвонить

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

Без необходимости сохранять свой чертеж на диск.

Проверьте https://code.djangoproject.com/wiki/Charts дляполный пример.

...