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().
È possibile eseguire questa operazione codificando il file pdf con base64 e aggiungendo al corpo del messaggio. –
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
Oh! Mi dispiace. Non puoi semplicemente scrivere l'output di wkhtmtopdf in un file in modalità binaria? –