2010-12-07 112 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() 

完美的作品!

相關問題