[Django]-Return pdf response from stdout with Django

5đź‘Ť

âś…

You should open your sub command like so:

popen = Popen(command_args, stdout=PIPE, stderr=PIPE)
body_contents = popen.stdout().read()
popen.terminate()
popen.wait()
r = HttpResponse(body_contents, mimetype='application/pdf')

Some things to be careful of:

  1. If your popen’d command writes to STDERR it may deadlock. You can solve this by using the communicate() function on the Popen object.
  2. You should try/finally this to make sure to always terminate() and wait().
  3. This loads the whole PDF into the memory of your python process, you may want to stream the bytes from the command to the outgoing socket.
👤Spike Gronim

1đź‘Ť

I can’t be definitive, because I have only genereated .PDF responses in PHP, however the basic idea will be the same.

1) Write your pdf file to STDOUT, not the file system, just as you would to return any other type of page.

2) Send then with the correct MIME type and headers. These are probaly:

Content-Disposition: inline; filename=”MyReportFile.pdf”
Content-type: application/pdf

You may need to check out Chache-Control and Expires headers also to get the behaviour you need.

👤Ian

0đź‘Ť

How do you want them returned?

If you want them as an attachment you can try:

fname = #something here to give dynamic file names from your variables
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename='+fname
return response

I wish I had the answer for how to open the pdf in browser, but this is a snippet from a project I did a while ago and I forgot some of the details.

👤j_syk

0đź‘Ť

If you just want to return the pdf as a 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')

Leave a comment