使用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', 'from@from.com', ['to@to.com'])
email.attach('invoice.pdf', ???, 'application/pdf')
email.send()
我只是不确定如何将我的pdfdocument翻译为blob,以便email.attach可以接受它,而email.send可以发送它。
有什么想法吗?
答案 0 :(得分:7)
使用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@email.com',["email@email.com"],headers={'Reply-To':'email@email.com'})
pdf=createPDF(request)
EmailMsg.attach('yourChoosenFileName.pdf',pdf,'application/pdf')
EmailMsg.send()
完美运作!!
答案 1 :(得分:4)
好的 - 基于拼凑一些东西我想出来了 -
首先 - 我的要求: - 我只想在内存中创建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', 'from@from.com', ['to@to.com'])
email.attach('invoicex.pdf', pdf , 'application/pdf')
email.send()
从网络生成转向电子邮件生成的问题是获得可以“附加”到电子邮件的正确对象。创建缓冲区,然后从缓冲区中获取数据对我来说......
答案 2 :(得分:3)
我看不到你的blob在哪里渲染,所以我不能告诉你如何导入它。我使用Pisa和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', 'from@from.com', ['to@to.com'])
email.attach('agreement.pdf', out.getvalue(), 'application/pdf')
email.send()
也就是说,如果您的PDF作为文件系统上的独立且持久的文档存在,那么您不能只是:
email.attach('agreement.pdf', open('agreement.pdf', 'rb').read(), 'application/pdf')