voltar pdf resposta do stdout com Django
-
14-11-2019 - |
Pergunta
Eu estou usando o wkhtmltopdf para criar arquivos PDF, como sempre, eu não sei como devolvê-los corretamente, então eu tinha que escrevê-los para a minha pasta de mídia e, em seguida, redireccionar para o recém-criado arquivo.
Editar:Ian conselho é escrever para STDOUT, para que eu tenha mudado minha wkhtmltopdf comando para fazer isso, mas agora eu não sei como retornar o conteúdo.
Eu tenho tentado utilizar o subprocesso.Popen desta forma:
r = HttpResponse(Popen(command_args), mimetype='application/pdf')
r['Content-Disposition'] = 'filename=recibos.pdf'
return r
Mas não estou obtendo bons resultados Obrigado antecipadamente.
Solução
Você deve abrir o sub comando assim:
popen = Popen(command_args, stdout=PIPE, stderr=PIPE)
body_contents = popen.stdout().read()
popen.terminate()
popen.wait()
r = HttpResponse(body_contents, mimetype='application/pdf')
Algumas coisas a ter o cuidado de:
- Se o seu popen gostaria de comando escreve para STDERR pode impasse.Você pode resolver isso usando a se comunicar() função Popen objeto.
- Você deve tentar o/, finalmente, que este certifique-se sempre de terminar() e wait().
- Isso carrega o PDF inteiro para a memória do python processo, você pode querer fluxo de bytes a partir do comando de saída do socket.
Outras dicas
Eu posso não ser definitivo, porque eu só tenho genereated .PDF respostas em PHP, no entanto, a idéia básica será o mesmo.
1) Escrever o seu arquivo pdf para STDOUT, e não o sistema de ficheiros, tal como faria para voltar qualquer outro tipo de página.
2) Enviar, em seguida, com o tipo MIME correto e cabeçalhos.Estas são provavelmente:
Content-Disposition:inline;nome de ficheiro="MyReportFile.pdf" Tipo de conteúdo:application/pdf
Você pode precisar confira Chache-Controle e Expira também para obter o comportamento que você precisa.
Como você quer que eles voltaram?
Se você quer que eles, como um anexo, você pode tentar:
fname = #something here to give dynamic file names from your variables
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename='+fname
return response
Eu desejo que eu tinha a resposta para como abrir o pdf no navegador, mas isto é um fragmento de um projeto que eu fiz há um tempo atrás, e eu esqueci alguns detalhes.
Se você só quer devolver o pdf como uma 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')