вернуть ответ в формате PDF от stdout с Джанго - PullRequest
3 голосов
/ 15 февраля 2011

Я использую wkhtmltopdf для создания PDF-файлов, однако я не знаю, как их правильно вернуть, поэтому мне пришлось записать их в свою папку мультимедиа, а затем перенаправить на только что созданный файл.

Edit: Совет Яна - написать в STDOUT, поэтому я изменил свою команду wkhtmltopdf, чтобы сделать это, но теперь я не знаю, как вернуть это содержимое.

Я пытался использовать подпроцесс. Открыть следующим образом:

r = HttpResponse(Popen(command_args), mimetype='application/pdf')
r['Content-Disposition'] = 'filename=recibos.pdf'
return r

Но я не получаю хороших результатов Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 21 февраля 2011

Вы должны открыть свою подкоманду так:

popen = Popen(command_args, stdout=PIPE, stderr=PIPE)
body_contents = popen.stdout().read()
popen.terminate()
popen.wait()
r = HttpResponse(body_contents, mimetype='application/pdf')

Некоторые вещи, которые следует соблюдать осторожность:

  1. Если ваша команда popen'd пишет в STDERR, она может зайти в тупик. Вы можете решить эту проблему, используя функцию connect () объекта Popen.
  2. Вы должны попробовать / наконец это сделать, чтобы всегда завершать () и ждать ().
  3. Это загружает весь PDF в память вашего процесса python, вы можете захотеть передать байты из команды в исходящий сокет.
1 голос
/ 16 февраля 2011

Я не могу быть окончательным, потому что я только генерировал ответы .PDF в PHP, однако основная идея будет такой же.

1) Запишите ваш файл PDF в STDOUT, а не в файловую систему, так же, как вы бы возвращали любой другой тип страницы.

2) Отправьте затем с правильным типом MIME и заголовками.Это пробалы:

Содержание-Диспозиция: встроенная;filename = "MyReportFile.pdf" Тип содержимого: application / pdf

Вам также может понадобиться проверить заголовки Chache-Control и Expires, чтобы получить необходимое поведение.

0 голосов
/ 25 ноября 2011

Если вы просто хотите вернуть PDF как Django HttpResponse:

from django.http import HttpResponse

def printTestPdf(request):
  return printPdf('/path/to/theFile.pdf')

def printPdf(path):
  with open(path, "rb") as f:
    data = f.read()
  return HttpResponse(data, mimetype='application/pdf')
0 голосов
/ 22 февраля 2011

Как вы хотите их вернуть?

Если вы хотите, чтобы они были прикреплены, вы можете попробовать:

fname = #something here to give dynamic file names from your variables
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename='+fname
return response

Хотелось бы, чтобы у меня был ответ о том, как открыть PDF в браузере, но это фрагмент проекта, который я делал недавно, и я забыл некоторые детали.

...