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.

¿Fue útil?

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:

  1. Si su comando POPEN'D escribe en Stvertr, puede interbular.Puede resolver esto utilizando la función de comunicación () en el objeto POMEN.
  2. Debe intentarlo / finalmente para asegurarse de terminar siempre () y esperar ().
  3. 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')

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top