【问题标题】:Django, ReportLab PDF Generation attached to an email附加到电子邮件的 Django,ReportLab PDF 生成
【发布时间】:2011-05-21 16:37:24
【问题描述】:

使用 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 可以发送它。

有什么想法吗?

【问题讨论】:

  • 我在 stackoverflow 上看到了其他几个问题,提出了类似的问题,但没有找到好的答案...

标签: django email reportlab


【解决方案1】:

使用报告实验室


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

完美运行!!

【讨论】:

    【解决方案2】:

    好的 - 我是根据拼凑一些东西得出的 -

    首先 - 我的要求: - 我只想在内存中创建 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()
    

    我从 Web 生成迁移到电子邮件生成的问题是找到可以“附加”到电子邮件的正确对象。创建一个缓冲区,然后从缓冲区中抓取数据为我完成了...

    【讨论】:

    • 对于那些使用 python3 的人,您必须使用 BytesIO 对象而不是 StringIO,因为字节和字符串不交叉兼容。
    【解决方案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')
    

    【讨论】:

    • 我已经更新了我的内容 --- 但我只是不确定响应对象、SimpleDocTemplate 对象或任何对象上存在什么方法来获取可以附加到的东西消息...
    • 我尝试了你的解决方案。但它在 pdf 文件中呈现我的 html 模板。你知道为什么会这样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2016-01-18
    • 1970-01-01
    • 2017-11-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多