打开一个新的浏览器窗口,其中包含从Python Pisa返回的PDF内容

时间:2013-03-08 15:50:15

标签: django pdf pisa

我有一个Javascript应用程序。当我单击一个按钮时,会使用POST请求将JSON对象发送到Django-Pisa远程服务器,以从JSON对象创建PDF文件。我必须使用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':class PDFDictionary 1 0 obj%标准字体字典&lt;&lt; / F1 2 0 R / F2 3 0 R / F3 4 0 R / F4 5 0 R&gt; endobj%'F1':class PDFType1Font 2 0 obj%Font Helvetica&lt;&lt; / BaseFont / Helvetica / Encoding / WinAnsiEncoding / Name / F1 / Subtype / Type1 / Type / Font&gt;&gt; endobj%'F2':class PDFType1Font 3 0 obj%Font Times-Roman&lt;&lt; / BaseFont / Times -

请告诉我如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

我不确定这会有效,但试一试 -

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

(如果确实有效,则归功于this question