2010-12-07 72 views
7

使用Django和ReportLab生成PDF并将它们附加到电子邮件消息的最佳方式是什么?Django,ReportLab PDF生成附加到电子邮件

我使用的是SimpleDocTemplate,还可以连接生成的PDF我的HttpResponse - 这是伟大的,但我有麻烦找出如何在相同的附件完全相同添加到电子邮件:

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

......让我的PDF文件通过附加表的文档...

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

我只是不知道如何我pdfdocument转换为BLOB,这样email.attach可以接受它,并email.send可以发送它。

任何想法?

+0

我已经在这里看到了一些其他问题在stackoverflow问一个类似的问题,但没有找到好的答案... – 2010-12-07 16:02:52

回答

3

OK - 我想出了基于拼凑几件事 -

首先 - 我的要求: - 我只想在内存中创建的PDF - 我不希望文件挂起,因为他们占用空间,我不想要什么可能是敏感数据悬而未决在服务器上不受保护。

所以 - 我选择ReportLab和Platypus功能来生成我的文档。现在我已经投入了足够的时间,这很容易。因此,我的方法是让我使用ReportLab中的DocTempates,允许我使用Django的电子邮件功能发送电子邮件。

这里是我如何做它:

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

我从网上代移动电子邮件产生的问题是越来越可能被“附加”到电子邮件合适的对象。创建一个缓冲区,然后抓取数据的缓冲区off为我做...

3

我没有看到你的blob渲染的位置,所以我不能告诉你如何导入它。我已经得到了使用比萨和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() 

也就是说,如果您的PDF作为一个独立的和持久的文件存在于文件系统,你不能只是:

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

我已经更新了我的内容有点---但我只是不知道什么方法存在在响应对象,SimpleDocTemplate对象或任何可以附加到消息的对象上... – 2010-12-08 02:06:38

6

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

完美的作品!

相关问题