8

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

email.attachがそれを受け入れ、email.sendがそれを送信できるように、pdfdocumentをblobとして変換する方法がわかりません。

何か案は?

4

3 に答える 3

8

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

完璧に動作します!!

于 2010-12-09T00:00:17.943 に答える
5

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', 'from@from.com', ['to@to.com'])
  email.attach('invoicex.pdf', pdf , 'application/pdf')
  email.send()

Web生成から電子メール生成への移行からの私の問題は、電子メールに「添付」できる適切なオブジェクトを取得することでした。バッファを作成し、バッファからデータを取得することで、私はそれを実行しました...

于 2010-12-08T21:28:15.007 に答える
3

ブロブがどこにレンダリングされているかわからないので、インポート方法についてアドバイスすることはできません。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')
于 2010-12-07T20:43:18.883 に答える