【问题标题】:return pdf response from stdout with Django使用 Django 从标准输出返回 pdf 响应
【发布时间】:2011-02-15 19:20:58
【问题描述】:

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

编辑: Ian 的建议是写入 STDOUT,因此我更改了我的 wkhtmltopdf 命令来执行此操作,但现在我不知道如何返回该内容。

我一直在尝试以这种方式使用 subprocess.Popen:

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

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

【问题讨论】:

  • 将pdf写入媒体文件夹有什么问题
  • 只是我不喜欢将它们作为 PDF 存储在我的服务器文件系统中的想法,因为这会消耗更多的磁盘空间。

标签: python django pdf wkhtmltopdf


【解决方案1】:

你应该像这样打开你的子命令:

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

【讨论】:

  • 感谢您的回复,只是一点,我在哪里可以找到这一行的读取功能? "body_contents = 读取(popen.stdout())"
  • 对不起,应该是 popen.stdout().read() - 我更正了我的答案。谢谢。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 感谢您的提示,现在我已将我的问题更新为更具体的方式。
【解决方案3】:

您希望它们如何返回?

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

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 的答案,但这是我不久前做的一个项目的 sn-p,我忘记了一些细节。

【讨论】:

  • 如果您删除设置 Content-Disposition 的行,您应该会在浏览器中看到 pdf,但您的浏览器需要安装 pdf 插件。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多