我正在使用wkhtmltopdf来创建pdf文件,我多么不知道如何正确返回它们,所以我必须将它们写入我的媒体文件夹,然后重定向到刚刚创建的文件。

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

我一直在尝试使用subprocess.popen:

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

但我没有得到良好的结果 提前致谢。

有帮助吗?

解决方案

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

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. 如果您的popend命令写入stderr,它可能会死锁。您可以通过在Popen对象上使用Communicate()函数来解决此问题。
  2. 你应该尝试/最后它可以务必始终终止()和等待()。
  3. 这将整个pdf加载到您的Python进程的内存中,您可能希望将字节从命令传输到输出套接字。

其他提示

我不能明确,因为我只在php中泛建了.pdf响应,但是基本想法将是相同的。

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

2)发送正确的MIME类型和标题。这些是probaly:

内容处理:内联;filename=“myreportfile.pdf” 内容类型:应用程序/ PDF

您可能需要查看Chock-Control并过期标题,以获取所需的行为。

你想如何回归?

如果您希望它们为附件,您可以尝试:

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的答案,但这是一个项目的片段,我在途中做了一段时间,我忘记了一些细节。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top