使用Django从stdout返回pdf响应

时间:2011-02-15 19:20:58

标签: python django pdf wkhtmltopdf

我使用wkhtmltopdf来创建PDF文件,但我怎么不知道如何正确地返回它们,所以我不得不将它们写入我的媒体文件夹然后重定向到刚刚创建的文件。

编辑: Ian的建议是写STDOUT,所以我已经改变了我的wkhtmltopdf命令来做到这一点,但现在我不知道如何返回该内容。

我一直在尝试使用subprocess.Popen这样:

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

但我没有取得好成绩 提前谢谢。

4 个答案:

答案 0 :(得分:4)

您应该像这样打开子命令:

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,它可能会死锁。您可以使用Popen对象上的communic()函数来解决此问题。
  2. 你应该尝试/最终确保始终终止()和wait()。
  3. 这会将整个PDF加载到python进程的内存中,您可能希望将命令中的字节流式传输到传出套接字。

答案 1 :(得分:1)

我无法确定,因为我在PHP中只生成了.PDF响应,但基本思路是一样的。

1)将您的pdf文件写入STDOUT,而不是文件系统,就像返回任何其他类型的页面一样。

2)然后使用正确的MIME类型和标题发送。这些都是可能的:

内容 - 处置:内联;文件名= “MyReportFile.pdf” 内容类型:application / pdf

您可能还需要查看Chache-Control和Expires标头,以获得所需的行为。

答案 2 :(得分:0)

你希望他们如何归还?

如果您想将它们作为附件,您可以尝试:

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的答案,但这是我之前做过的项目的片段,我忘了一些细节。

答案 3 :(得分:0)

如果您只想将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')