2010-12-07 33 views
7

Quelle est la meilleure façon d'utiliser Django et ReportLab pour générer des fichiers PDF et les joindre à un e-mail?Django, ReportLab PDF Generation attaché à un email

J'utilise un SimpleDocTemplate et peut fixer le PDF généré à mon HttpResponse - ce qui est génial, mais je vais avoir du mal à trouver comment ajouter exactement la même pièce jointe à un e-mail:

# Create the HttpResponse object with the appropriate PDF headers. 
    response = HttpResponse(mimetype='application/pdf') 
    response['Content-Disposition'] = 'attachment; filename=invoice.pdf' 
    doc = SimpleDocTemplate(response, pagesize=letter) 
    Document = [] 

... faire mon pdf en ajoutant des tables au document ...

doc.build(Document) 
    email = EmailMessage('Hello', 'Body', '[email protected]', ['[email protected]']) 
    email.attach('invoice.pdf', ???, 'application/pdf') 
    email.send() 

Je ne suis pas sûr de savoir comment traduire mon PDFDocument comme blob pour que Email.Attache peut l'accepter et email.send peut envoyer il.

Des idées?

+0

J'ai vu quelques autres questions ici sur stackoverflow poser une question similaire, mais j'ai trouvé aucune bonne réponse ... –

Répondre

3

OK - Je l'ai trouvé basé sur la reconstitution de quelques choses ensemble -

Tout d'abord - mes exigences: - Je voulais seulement créer les fichiers PDF en mémoire - Je ne veux pas les fichiers qui traînent, car ils prennent de la place, et je ne veux pas ce qui pourrait être des données sensibles qui pendent aro und non protégé sur le serveur. Donc, j'ai choisi la fonctionnalité ReportLab et Platypus pour générer mes documents. J'ai investi suffisamment de temps maintenant, c'est facile. Voici donc mon approche qui me permet d'utiliser DocTempates dans ReportLab, qui me permet d'utiliser les capacités de messagerie de Django pour envoyer des emails.

Voilà comment je le fais:

# Create the PDF object, using the buffer object as its "file." 
    buffer = StringIO() 
    doc = SimpleDocTemplate(buffer, pagesize=letter) 
    Document = [] 

    # CRUFT PDF Data 

    doc.build(Document) 
    pdf = buffer.getvalue() 
    buffer.close() 

    email = EmailMessage('Hello', 'Body', '[email protected]', ['[email protected]']) 
    email.attach('invoicex.pdf', pdf , 'application/pdf') 
    email.send() 

Ma question de se déplacer de génération Web pour envoyer un courriel génération obtenait l'objet droit qui pourrait être « attaché » à un courrier électronique. Création d'un tampon, puis récupérer les données hors du tampon a fait pour moi ...

3

Je ne vois pas où votre blob est rendu, donc je ne peux pas vous conseiller sur la façon de l'importer. J'ai obtenu d'excellents résultats en utilisant Pise et StringIO:

import ho.pisa as pisa 
import StringIO 
from django.template.loader import render_to_string 
from django.core.mail import EmailMessage 

render = render_to_string("books/agreement/agreement_base.html", 
           { "title": book.title, 
           "distribution": book.distribution_region }) 
out = StringIO.StringIO() 
pdf = pisa.CreatePDF(StringIO.StringIO(render), out) 
email = EmailMessage('Hello', 'Body', '[email protected]', ['[email protected]']) 
email.attach('agreement.pdf', out.getvalue(), 'application/pdf') 
email.send() 

Cela dit, si votre PDF existe en tant que document indépendant et persistant sur votre système de fichiers, ne pouvait pas vous venez:

email.attach('agreement.pdf', open('agreement.pdf', 'rb').read(), 'application/pdf') 
+0

J'ai mis à jour mon contenu un peu --- mais je ne suis pas sûr de la méthode qui existe soit sur l'objet de réponse, l'objet SimpleDocTemplate, soit sur n'importe quel objet pour obtenir quelque chose qui peut être attaché au message ... –

+0

J'ai essayé votre solution. Mais c'est le rendu de mon modèle html dans le fichier pdf. Savez-vous pourquoi cela se passe? – silviomoreto

6

En utilisant ReportLab


try: 
    from cStringIO import StringIO 
except ImportError: 
    from StringIO import StringIO 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter, A4 
from reportlab.lib.units import inch 

def createPDF(request): 
x=100 
y=100 
buffer=StringIO() 
p=canvas.Canvas(buffer,pagesize=letter) 
p.drawString(x,y,"HELLOWORLD") 
p.showPage() 
p.save() 
pdf=buffer.getvalue() 
buffer.close() 
return pdf 

def someView(request): 
EmailMsg=mail.EmailMessage(YourSubject,YourEmailBodyCopy,'[email protected]',["[email protected]"],headers={'Reply-To':'[email protected]'}) 
pdf=createPDF(request) 
EmailMsg.attach('yourChoosenFileName.pdf',pdf,'application/pdf') 
EmailMsg.send() 

Fonctionne parfaitement !!