Я не могу точно сказать, что является причиной вашей проблемы - это может быть вызвано проблемами с буферизацией в StringIO.
Однако вы ошибаетесь, если предполагаете, что этот код будет фактически передавать сгенерированные данные PDF: StringIO.getvalue () возвращает содержимое строкового буфера во время вызова этого метода, а не выходной поток (см. http://docs.python.org/library/stringio.html#StringIO.StringIO.getvalue).
Если вы хотите транслировать вывод, вы можете рассматривать экземпляр HttpResponse как файлоподобный объект (см. http://docs.djangoproject.com/en/1.2/ref/request-response/#usage).
Во-вторых, я не вижу никакой причинычтобы использовать здесь StringIO. В соответствии с документацией Пизы, которую я обнаружил (кстати, она вызывает эту функцию CreatePDF), источником может быть строка или объект Unicode.
Лично я бы попробовал следующее:
- Создание HTML в виде строки Unicode
- Создание и настройка объекта HttpResponse
- Вызов генератора PDF со строкой в качестве ввода и ответом в качестве вывода
В общих чертах это может выглядеть следующим образом:
html = template.render(context)
response = HttpResponse()
response['Content-Type'] ='application/pdf'
response['Content-Disposition']='attachment; filename=%s.pdf'%(filename)
pisa.CreatePDF(
src=html,
dest=response,
show_error_as_pdf=True)
#response.flush()
return response
Однако я не попытался, если это действительно работает. (Я делал этот вид потоковой передачи PDFнаПока только в Java.)
Обновление: Я только что посмотрел на реализацию HttpResponse.Он реализует файловый интерфейс, собирая фрагменты строк, записанных в него, в список.Вызывать response.flush () бессмысленно, потому что он ничего не делает.Кроме того, вы можете установить параметры ответа, такие как Content-Type, даже после того, как ответ был получен как файл-объект.
Ваша первоначальная проблема также может быть связана с тем фактом, что вы никогда не закрывали объекты StringIO.Базовый буфер объекта StringIO не освобождается до вызова close ().