Domanda

Sto usando WKHTMLTOPDF per creare file PDF, come mai non so come restituirli correttamente, quindi ho dovuto scriverli nella tua cartella Media e quindi reindirizzarsi al file appena creato.

Modifica: Il consiglio di Ian è scrivere su Stdout, quindi ho cambiato il mio comando wkhtmltopdf per farlo, ma ora non so come restituire quel contenuto.

Ho provato a usare subprocess.popen in questo modo:

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

Ma non sto ottenendo buoni risultati Grazie in anticipo.

È stato utile?

Soluzione

Dovresti aprire il comando secondario come:

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

Alcune cose da attentare:

    .
  1. Se il tuo comando PAPEN è scritto a STDERR, può deadlock.Puoi risolverlo utilizzando la funzione Comunicare () sull'oggetto PACEN.
  2. Dovresti provare / infine questo per essere sicuro di terminare sempre () e aspettare ().
  3. Questo carica l'intero PDF nella memoria del processo Python, è possibile che si desideri trasmettere i byte dal comando alla presa in uscita.

Altri suggerimenti

Non posso essere definitivo, perché ho generato solo risposte .pdf in PHP, tuttavia l'idea di base sarà la stessa.

1) Scrivi il file PDF in Stdout, non il file system, proprio come si restituisce qualsiasi altro tipo di pagina.

2) Invia quindi con il tipo di mima corretto e le intestazioni.Questi sono probaly:

Contenuto-Disposizione: in linea;FILENAME="MYREPORTFILE.PDF" Tipo di contenuto: Applicazione / PDF

Potrebbe essere necessario controllare il controllo del chache e scadere le intestazioni anche per ottenere il comportamento di cui hai bisogno.

Come vuoi tornare?

Se li desideri come allegato puoi provare:

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

Vorrei avere la risposta per come aprire il PDF nel browser, ma questo è uno snippet da un progetto che ho fatto qualche tempo fa e ho dimenticato alcuni dei dettagli.

Se vuoi solo restituire il PDF come 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')
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top