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.

Foi útil?

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:

  1. Se o seu popen gostaria de comando escreve para STDERR pode impasse.Você pode resolver isso usando a se comunicar() função Popen objeto.
  2. Você deve tentar o/, finalmente, que este certifique-se sempre de terminar() e wait().
  3. 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')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top