2010-12-07 9 views
7

Wie können Sie mit Django und ReportLab PDFs erstellen und sie an eine E-Mail-Nachricht anhängen?Django, ReportLab PDF-Generierung an eine E-Mail angehängt

ich ein SimpleDocTemplate bin mit und kann die generierten PDF-Datei meinen Httpresponse befestigen - das ist toll, aber ich habe Probleme, herauszufinden, wie genau die gleiche Anlage zu einer E-Mail hinzufügen:

# 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 = [] 

... mein pdf macht von Tabellen auf das Dokument angehängt ...

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

ich einfach nicht sicher bin, wie mein PDFDocument als Blob zu übersetzen, so dass email.attach es akzeptieren kann und email.send können senden es.

Irgendwelche Ideen?

+0

Ich habe ein paar andere Fragen hier auf Stackoverflow eine ähnliche Frage zu stellen, aber keine gute Antwort gefunden ... –

Antwort

3

OK - Ich habe es herausgefunden, basierend auf ein paar Dinge zusammensetzen -

Erstens - meine Anforderungen: - Ich wollte nur die PDFs im Speicher erstellen - Ich will nicht die Dateien herumhängen, wie sie Platz einnehmen, und ich möchte nicht, was möglicherweise sensible Daten hängen Aro und ungeschützt auf dem Server.

Also - ich wählte ReportLab und Platypus Funktionalität zum Generieren meiner Dokumente. Ich habe jetzt genug Zeit dafür investiert, das ist einfach. Also hier ist mein Ansatz, der mir erlaubt, die DocTempates in ReportLab zu verwenden, ermöglicht es mir, E-Mail-Funktionen von Django zu verwenden, um E-Mails zu senden.

Hier ist, wie ich es so mache:

# 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() 

Meine Ausgabe von Web-Generation von beweglicher Generation zu E-Mail wurde das richtige Objekt erhalten, die „angehängt“ zu einer E-Mail werden konnte. einen Puffer anlegen, dann die Daten aus dem Puffer Grabbing hat es für mich ...

3

Ich sehe nicht, wo Ihr Blob gerendert wird, also kann ich Ihnen nicht empfehlen, wie Sie es importieren.

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() 

Das heißt, wenn Sie Ihre PDF existiert als unabhängige und persistent Dokument auf dem Dateisystem, konnte nicht einfach: Ich habe gute Ergebnisse mit Pisa und StringIO bekommen

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

Ich habe meine Inhalte ein wenig aktualisiert --- aber ich bin nur nicht sicher, welche Methode existiert entweder auf das Antwortobjekt, auf das SimpleDocTemplate-Objekt oder auf ein Objekt, das etwas erhält, das an die Nachricht angehängt werden kann ... –

+0

Ich habe die Lösung versucht. Aber das Rendering der HTML-Vorlage in der PDF-Datei. Weißt du, warum das passiert? – silviomoreto

6

Mit 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() 

funktioniert perfekt !!

Verwandte Themen