2014-06-18 11 views
5

Sto usando wkhtmltopdf wrapper per generare template in PDF in Django 1.6. Funziona bene quando voglio visualizzare il PDF in seguito o inviare il file PDF con HttpResponse per il download, ma quello che voglio fare è creare il file nella mia cartella tmp e collegarlo ad una email.Un modo per creare file PDF con wkhtmltopdf senza restituire HttpResponse o utilizzare l'URL? Voglio solo allegare un file PDF all'e-mail

Non sono sicuro di come ottenere ciò.

# views.py 

context = { 
    'products_dict': products_dict, 
    'main_categories': main_categories, 
    'user_category': user_category 
} 

response = PDFTemplateResponse(request=request, 
           context=context, 
           template="my_template.html", 
           filename="filename.pdf", 
           show_content_in_browser=True, 
           cmd_options={'encoding': 'utf8', 
              'quiet': True, 
              'orientation': 'landscape', 
              } 
           ) 

return response 

Il codice sopra genera il PDF esattamente come lo voglio. Il fatto è che non voglio visualizzare il PDF nel browser o avviare un download (non voglio restituire la risposta). Voglio solo per creare e poi allegare il file ad una e-mail come questa:

email = EmailMessage() 
email.subject = "subject" 
email.body = "Your PDF" 
email.from_email = "[email protected]" 
email.to = [ "[email protected]", ] 

# Attach PDF file to the email 
email.attach_file(my_pdf_file_here) 
# Send email 
email.send() 

ho provato ad usare sottoprocesso ma non sembra come posso inviare contesto al mio modello per renderlo prima di generare il PDF .

MODIFICA (SOLUZIONE): Grazie a Daniel Roseman per l'aiuto per andare verso ciò che volevo. Ho usato il file di test di wkhtmltopdf qui: http://pydoc.net/Python/django-wkhtmltopdf/1.1/wkhtmltopdf.tests.tests/

Questo è quello che ho fatto a mio avviso:

order = Order.objects.get(id=order_id) 
return_file = "tmp/" + 'order' + str(order_id) + '.pdf' 

context = { 
    'order' : order, 
    'items' : order.ordered_products.all() 
} 

response = PDFTemplateResponse(request=request, 
           context=context, 
           template="'products/order_pdf.html'", 
           cmd_options={ 'encoding': 'utf8', 
              'quiet': True 
              } 
           ) 

temp_file = response.render_to_temporary_file("products/order_pdf.html") 

wkhtmltopdf(pages=[temp_file.name], output=return_file) 

è quindi possibile utilizzare il return_file in email.attach() metodo come questo:

email.attach_file(return_file) 

È anche possibile omettere il parametro di uscita nel metodo wkhtmltopdf. Quindi il metodo restituirà l'output e utilizzerà questo output nel metodo attach_file().

+0

È possibile eseguire questa operazione codificando il file pdf con base64 e aggiungendo al corpo del messaggio. –

+0

Il collegamento del file all'email non è un problema. Il problema è creare il file PDF con wkhtmltopdf senza restituire HttpResponse o utilizzare una vista URL/Class – dguay

+0

Oh! Mi dispiace. Non puoi semplicemente scrivere l'output di wkhtmtopdf in un file in modalità binaria? –

risposta

3

Il tuo problema non è con wkhtmltopdf, ma il django-wkhtmltopdf che fornisce alcune viste basate sulla classe che esegue il rendering con wkhtmltopdf. Se non si desidera una vista, non è necessario utilizzarli: è sufficiente visualizzare il modello e passare la stringa del risultato allo strumento wkhtmltopdf della riga di comando.

Sembra che la libreria django-wkhtmltopdf fornisca alcune funzioni di utilità (nella directory utils) che potrebbero rendere un po 'più semplice l'ultimo passaggio.

+1

Questo è esattamente quello che stavo cercando! da qui: https://github.com/incuna/django-wkhtmltopdf/blob/master/wkhtmltopdf/utils.py Potrei usare la funzione wkhtmltopdf. Una domanda però, come posso rendere il mio modello con le mie variabili di contesto prima di passarlo alla funzione wkhtmltopdf? – dguay

+0

È possibile utilizzare la scorciatoia render_to_string. –

+0

Sono confuso su cosa fare con la stringa in seguito ... Devo fornire un percorso file o un URL del codice HTML da convertire nella funzione wkhtmltopdf. – dguay

0

Ehi, per favore controlla che il tuo binario wkhtmltopdf sia eseguibile o meno. come questo PDFTemplateResponse ha funzionato per me.

-1
response = PDFTemplateResponse(
    request, 
    template='reports/report_email.html', 
    filename='weekly_report.pdf', 
    context=render_data, 
    cmd_options={'load-error-handling': 'ignore'}) 



subject, from_email, to = 'reports', '[email protected]', '[email protected]' 
html_content = render_to_string('reports/report_email.html',render_data) 
text_content = strip_tags(html_content) 
msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) 
msg.attach_alternative(html_content, "text/html") 
msg.attach('pdf_filename.pdf', response.rendered_content, 'application/pdf') 
msg.send() 

questo snippet di codice può esserti utile dopo averlo inserito in views.py.