Devuelve la respuesta PDF de STDOUT con DJANGO
-
14-11-2019 - |
Pregunta
Estoy usando WKHTMLTOPDF para crear archivos PDF, por lo que no sé cómo devolverlos correctamente, así que tuve que escribirlos a mi carpeta de medios y luego redirigirlo al archivo creado.
Editar: El consejo de Ian es escribir a STDOUT, así que he cambiado mi comando wkhtmltopdf para hacerlo, pero ahora no sé cómo devolver ese contenido.
He estado tratando de usar subprocesos.popen de esta manera:
r = HttpResponse(Popen(command_args), mimetype='application/pdf')
r['Content-Disposition'] = 'filename=recibos.pdf'
return r
pero no estoy obteniendo buenos resultados Gracias de antemano.
Solución
Debe abrir su comando secundario así:
popen = Popen(command_args, stdout=PIPE, stderr=PIPE)
body_contents = popen.stdout().read()
popen.terminate()
popen.wait()
r = HttpResponse(body_contents, mimetype='application/pdf')
Algunas cosas para tener cuidado con:
- Si su comando POPEN'D escribe en Stvertr, puede interbular.Puede resolver esto utilizando la función de comunicación () en el objeto POMEN.
- Debe intentarlo / finalmente para asegurarse de terminar siempre () y esperar ().
- Esto carga todo el PDF en la memoria de su proceso de Python, es posible que desee transmitir los bytes desde el comando hasta el zócalo saliente.
Otros consejos
No puedo ser definitivo, porque solo he generado respuestas .PDF en PHP, sin embargo, la idea básica será la misma.
1) Escriba su archivo PDF en STDOUT, no el sistema de archivos, tal como lo haría para devolver cualquier otro tipo de página.
2) Envíe entonces con el tipo de Mime y los encabezados correctos.Estos son probadas:
Contenido-Disposición: En línea;FILENAME="MYREPORTFILE.PDF" Tipo de contenido: Aplicación / PDF
Es posible que deba verificar el control de chach y expire los encabezados también para obtener el comportamiento que necesita.
¿Cómo quieres que regresen?
Si los desea como un archivo adjunto, puede intentarlo:
fname = #something here to give dynamic file names from your variables
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename='+fname
return response
Desearía tener la respuesta de cómo abrir el PDF en el navegador, pero este es un fragmento de un proyecto que hice hace un tiempo y olvidé algunos de los detalles.
Si solo desea devolver el PDF como un 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')