2010-05-07 5 views
7

HTML 폼의 사용자 입력에서 PDF (reportlab + pypdf 사용)를 동적으로 생성하는 django 앱이 있으며 application/pdf MIMEType의 HTTP 응답을 반환합니다.동적으로 PDF를 생성하고 장고를 사용하여 이메일 보내기

위의 작업을 수행하거나 생성 된 pdf를 전자 메일로 보낼 수있는 옵션이 필요하지만 EmailMessage 클래스의 attach(filename=None, content=None, mimetype=None) 메서드를 사용하는 방법을 알 수 없습니다. documentation은 어떤 종류의 객체에 대한 설명을 많이하지 않습니다. content이되어야합니다. 나는 파일 객체와 위의 application/pdf HTTP 응답을 시도했다.

현재 내보기에서 PDF를 디스크에 저장 한 다음 attach_file() 방법을 사용하여 보내는 파일에 결과 파일을 첨부하는 방법이 있습니다. 이것은 나에게 잘못된 것처럼 보입니다. 그리고 저는 더 좋은 방법이 있다고 확신합니다.

message.attach('design.png', img_data, 'image/png') 

는 PDF 파일에 대한 내용이 당신이 일반적으로 PDF 파일에 기록하는 것과 같은 출력을하지 않을까요 : 당신의 link의 예를 바탕으로

답변

0

? 대신 myfile.pdf에 generated_pdf_data를 저장하는의 message.attach의 내용 필드에 연결 : 나는 그것을 알아 냈어요 좋아

message.attach('myfile.pdf', generated_pdf_data, 'application/pdf') 
+0

에 PDF를 연결합니다. – Shane

+0

어쨌든 파일에 실제로 쓰려고한다면 attach_file()을 사용하고 open() 행을 저장할 수도 있습니다. 이것은 '기억 속에'붙어있는 데 도움이 될 수 있습니다. http://two.pairlist.net/pipermail/reportlab-users/2009-April/008206.html – Lee

6

.

attach()의 두 번째 인수는 문자열을 필요로합니다. 난 그냥 찾던 생성하는 파일 객체의 read() 방법을 사용 :

from django.core.mail import EmailMessage 

message = EmailMessage('Hello', 'Body goes here', '[email protected]', 
    ['[email protected]', '[email protected]'], ['[email protected]'], 
    headers = {'Reply-To': '[email protected]'}) 
attachment = open('myfile.pdf', 'rb') 
message.attach('myfile.pdf',attachment.read(),'application/pdf') 

내가 대신 임시 파일을 사용하여 종료하지만, 개념은 일반 파일 객체와 동일합니다.

+3

Reportlab과 pyPdf는 모두 StringIO 또는 cStringIO 객체를 사용할 수 있으므로 임시 파일을 사용할 필요가 없습니다. – AKX

4

임시 파일을 생성하십시오.

from django.utils import timezone  
from io import BytesIO 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 

def generate_pdf(pk): 
    y = 700 
    buffer = BytesIO() 
    p = canvas.Canvas(buffer, pagesize=letter) 
    p.setFont('Helvetica', 10) 
    p.drawString(220, y, "PDF generate at "+timezone.now().strftime('%Y-%b-%d')) 
    p.showPage() 
    p.save() 
    pdf = buffer.getvalue() 
    buffer.close() 
    return pdf 

내가() 함수가 이해할 첨부 형식으로 PDF 데이터를 생성하는 방법을 잘 모르겠어요 메시지

from django.core.mail import EmailMessage 
def send(request) 
    pdf = generate_pdf(pk) 
    msg = EmailMessage("title", "content", to=["[email protected]"]) 
    msg.attach('my_pdf.pdf', pdf, 'application/pdf') 
    msg.content_subtype = "html" 
    msg.send() 
관련 문제