Question

J'utilise wkhtmltopdf pour créer des fichiers PDF, comme je ne sais pas comment les retourner correctement, j'ai donc dû les écrire dans mon dossier multimédia, puis rediriger vers le fichier juste créé.

Edit: Le conseil d'Ian est d'écrire à STDOUT, j'ai donc changé ma commande wkhtmltopdf pour le faire, mais maintenant je ne sais pas comment retourner ce contenu.

J'ai essayé d'utiliser Sub-Process.popen de cette façon:

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

Mais je n'obtiens pas de bons résultats grâce à l'avance.

Était-ce utile?

La solution

Vous devez ouvrir votre sous-commande comme tel:

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

Certaines choses à faire attention:

  1. Si votre commande POPEN écrit à Stderr, il peut être imprégné. Vous pouvez résoudre ce problème en utilisant la fonction communicate () sur l'objet POPEN.
  2. Vous devez essayer / enfin cela pour vous assurer de toujours terminer () et d'attendre ().
  3. Cela charge l'ensemble du PDF dans la mémoire de votre processus Python, vous voudrez peut-être diffuser les octets de la commande à la prise sortante.

Autres conseils

Je ne peux pas être définitif, car je n'ai des réponses .pdf généreuses que dans PHP, mais l'idée de base sera la même.

1) Écrivez votre fichier PDF sur STDOUT, pas le système de fichiers, tout comme vous le feriez pour retourner tout autre type de page.

2) Envoyez ensuite avec le type MIME et les en-têtes corrects. Ce sont probablement:

Disposition du contenu: en ligne; filename = "MyReportFile.pdf" Contenu-Type: Application / PDF

Vous devrez peut-être consulter Chache-Control et expire les en-têtes également pour obtenir le comportement dont vous avez besoin.

Comment voulez-vous qu'ils soient retournés?

Si vous les voulez comme une pièce jointe, vous pouvez essayer:

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

J'aimerais avoir la réponse pour ouvrir le PDF dans le navigateur, mais c'est un extrait d'un projet que j'ai fait il y a quelque temps et j'ai oublié certains détails.

Si vous voulez juste retourner le PDF en tant que 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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top