2010-12-07 48 views
7

¿Cuál es la mejor manera de usar Django y ReportLab para generar archivos PDF y adjuntarlos a un mensaje de correo electrónico?Django, ReportLab PDF Generation adjunto a un correo electrónico

estoy usando un SimpleDocTemplate y pueden adjuntar el PDF generado a mi HttpResponse - que es grande, pero estoy teniendo problemas para encontrar la manera de poner exactamente el mismo archivo adjunto a un correo electrónico:

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

... hacer mi pdf añadiendo tablas para el Documento ...

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

yo no estoy seguro de cómo traducir mi PDFDocument como una gota de manera que email.attach puede aceptarlo y email.send puede enviar eso.

¿Alguna idea?

+0

He visto un par de otras preguntas aquí en stackoverflow para hacer una pregunta similar, pero no encontré una buena respuesta ... –

Respuesta

3

OK - Lo descubrí basándome en unir algunas cosas:

Primero, mis requisitos: - Solo quería crear los archivos PDF en la memoria - No quiero que los archivos se queden, ya que ocupan espacio, y no quiero que lo que podría ser datos confidenciales cuelguen aro y desprotegido en el servidor.

Así que elegí la funcionalidad ReportLab y Platypus para generar mis documentos. He invertido suficiente tiempo en eso ahora, es fácil. Así que aquí está mi enfoque que me permite usar DocTempates en ReportLab, me permite usar las capacidades de correo electrónico de Django para enviar correos electrónicos.

Así es como lo estoy haciendo:

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

Mi problema de pasar de generación en generación web de correo electrónico estaba recibiendo el objeto correcto que podrían ser "unido" a un correo electrónico. La creación de un búfer, agarrando los datos de la memoria intermedia lo hizo por mí ...

3

No veo dónde se representa su blob, por lo que no puedo aconsejarle sobre cómo importarlo. He conseguido grandes resultados utilizando Pisa y 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() 

Dicho esto, si su PDF existe como un documento independiente y persistente en su sistema de archivos, no podía que acaba:

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

He actualizado un poco mi contenido --- pero no estoy seguro de qué método existe ya sea en el objeto de respuesta, el objeto SimpleDocTemplate o cualquier objeto para obtener algo que se pueda adjuntar al mensaje ... –

+0

Intenté su solución. Pero está convirtiendo la plantilla my html en el archivo pdf. ¿Sabes por qué está pasando esto? – silviomoreto

6

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

funciona perfectamente !!

Cuestiones relacionadas