Откройте новое окно браузера с содержимым PDF, возвращенным из Python Pisa

У меня есть приложение Javascript. Когда я нажимаю кнопку, объект JSON отправляется с помощью запроса POST на удаленный сервер Django-Pisa для создания файла PDF из объекта JSON. Мне нужно использовать POST, поскольку длина JSON намного превышает допустимую длину GET.

Это моя функция рендеринга Django

@csrf_exempt
def render_to_pdf(request):
  request_data = ast.literal_eval(request.POST.keys()[0])
  template_src = templates_map.TEMPLATES_MAP[request_data['intervention']]
  context_json = request_data['data']
  template = get_template(template_src)
  context = Context(context_json)
  html  = template.render(context)
  result = StringIO.StringIO()

  pdf = pisa.pisaDocument(StringIO.StringIO(html), result,link_callback=fetch_resources)

  if not pdf.err:
    return HttpResponse(result.getvalue(), content_type='application/pdf')
  return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))

На стороне javascript это событие щелчка

try {
  jQuery.post('http://pdfgen-server/pdfgen', JSON.stringify(requestData), 
    function(data) {
      var w = window.open();
      w.document.write(data);
    });
}
catch (err) {
  ; //error handling
}

Когда я щелкаю то, что я получаю, это новое окно, и содержимое, вместо визуализированного файла PDF, является буквально содержимым PDF (что-то вроде того, что я открываю блокнот для просмотра файла PDF). Первые несколько строк в новом окне браузера:

% PDF-1.4% ReportLab Созданный PDF-документ http://www.reportlab.com% 'BasicFonts': класс PDFDictionary 1 0 obj% Словарь стандартных шрифтов ‹* / F1 2 0 R / F2 3 0 R / F3 4 0 R / F4 5 0 R >> endobj% 'F1': class PDFType1Font 2 0 obj% Font Helvetica ‹★ / BaseFont / Helvetica / Encoding / WinAnsiEncoding / Name / F1 / Subtype / Type1 / Type / Font >> endobj% 'F2': class PDFType1Font 3 0 obj% Font Times-Roman ‹$ / BaseFont / Times-

Пожалуйста, дайте мне знать, как я могу решить эту проблему?

Спасибо


person Nghi Vo    schedule 08.03.2013    source источник


Ответы (1)


На самом деле я не уверен, что это сработает, но попробуйте -

try {
  jQuery.post('http://pdfgen-server/pdfgen', JSON.stringify(requestData), 
    function(data) {
      window.open("data:application/pdf," + escape(data));
    });
}
catch (err) {
  ; //error handling
}

(Если это сработает, ответьте на этот вопрос)

person Aidan Ewen    schedule 08.03.2013
comment
Собственно, это должно быть window.open (data: application / pdf, + escape (data)); - person Nghi Vo; 09.03.2013
comment
Уловка не работает в IE6 / 7, отлично работает в Chrome. IE 6/7 не поддерживает dataURI. К сожалению, я застрял в IE. - person Nghi Vo; 09.03.2013
comment
Я обновлю свой ответ, чтобы использовать escape-функцию. Не уверен, как обращаться с ie6 / 7. Я думаю, что вы действительно хотите отправить данные сообщения Json, как если бы это была форма, но я не уверен, как вы это сделаете. Возможно, вы можете создать форму на лету, но поменяйте данные формы на свой json до того, как форма действительно отправится. - person Aidan Ewen; 09.03.2013
comment
Для этого решения мало что можно сделать в любой версии IE - они устанавливают довольно низкий предел длины URL-адреса: 2048 символов. - person Jeff; 19.09.2014