2016-11-30 3 views
0

Я использую Django 1.10.3 и Reportlab для экспорта html в pdf сейчас. Я хочу отправить электронное письмо с тем же сгенерированным pdf.I смог создать pdf-файл, но не смог напишите его. Пожалуйста, помогите мне в этом.Экспорт HTML в PDF и отправка сгенерированного PDF-файла по электронной почте в DJANGO

Вот мое мнение:

def write_pdf_view(request): 
    response = HttpResponse(content_type='application/pdf') 
    response['Content-Disposition'] = 'inline; filename="mypdf.pdf"' 

    buff = StringIO() 

    menu_pdf = SimpleDocTemplate(buff, rightMargin=72, 
           leftMargin=72, topMargin=50, bottomMargin=18) 

    elements = [] 
    styles = getSampleStyleSheet() 
    styles.add(ParagraphStyle(name='centered',fontName='Italic', alignment=TA_CENTER)) 
    elements.append(Paragraph('A good thing about WeasyPrint is that you can convert a HTML document to a PDF. So you can create a regular Django template, print and format all the contents and then pass it to the WeasyPrint library to do the job of creating the pdf.', style=styles["Normal"])) 

    menu_pdf.build(elements) 
    response.write(buff.getvalue()) 
    buff.close() 

Update:

subject = 'Welcome to Project Management Portal.' 
message = 'Thank you for being part of us. \n We are glad to have you. \n Regards \n Team Project Management' 

from_email = settings.EMAIL_HOST_USER 
to_list = [request.user.email, settings.EMAIL_HOST_USER] 

message = EmailMessage(subject, message, from_email, to_list) 
pdf = open('mypdf.pdf', 'rb') 
message.attach('mypdf-2.pdf', pdf, 'application/pdf') 
message.send() 

Error:

Environment:

Request Method: GET 
Request URL: http://127.0.0.1:8000/pdf_template/ 

Django Version: 1.10.3 
Python Version: 2.7.12 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'Project', 
'UserManagement', 
'social.apps.django_app.default'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "C:\Python27\lib\site-packages\django\core\handlers\exception.py" in inner 
    39.    response = get_response(request) 

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in _legacy_get_response 
    249.    response = self._get_response(request) 

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "E:\New folder\Aditya\ProjectManagement\Project\views.py" in pdf_view 
    267.    message.send() 

File "C:\Python27\lib\site-packages\django\core\mail\message.py" in send 
    342.   return self.get_connection(fail_silently).send_messages([self]) 

File "C:\Python27\lib\site-packages\django\core\mail\backends\smtp.py" in send_messages 
    107.     sent = self._send(message) 

File "C:\Python27\lib\site-packages\django\core\mail\backends\smtp.py" in _send 
    121.   message = email_message.message() 

File "C:\Python27\lib\site-packages\django\core\mail\message.py" in message 
    306.   msg = self._create_message(msg) 

File "C:\Python27\lib\site-packages\django\core\mail\message.py" in _create_message 
    394.   return self._create_attachments(msg) 

File "C:\Python27\lib\site-packages\django\core\mail\message.py" in _create_attachments 
    407.      msg.attach(self._create_attachment(*attachment)) 

File "C:\Python27\lib\site-packages\django\core\mail\message.py" in _create_attachment 
    449.   attachment = self._create_mime_attachment(content, mimetype) 

File "C:\Python27\lib\site-packages\django\core\mail\message.py" in _create_mime_attachment 
    437.    Encoders.encode_base64(attachment) 

File "C:\Python27\lib\email\encoders.py" in encode_base64 
    45.  encdata = _bencode(orig) 

File "C:\Python27\lib\email\encoders.py" in _bencode 
    31.  hasnewline = (s[-1] == '\n') 

Exception Type: TypeError at /pdf_template/ 
Exception Value: 'file' object has no attribute '__getitem__' 
+0

До сих пор я использую http://pdfcrowd.com/forums/read.php?3,2153 https: // docs.djangoproject.com/en/1.10/topics/email/ –

+0

use wkhtmltopdf https://learnbatta.com/blog/django-html-to-pdf-using-pdfkit-and-wkhtmltopdf-5/ –

ответ

1

Try This:

def pdf_view(request): 
fs = FileSystemStorage() 
filename = 'mypdf.pdf' 
if fs.exists(filename): 
    with fs.open(filename) as pdf: 
     response = HttpResponse(pdf, content_type='application/pdf') 
     response['Content-Disposition'] = 'inline; filename="mypdf.pdf"' 

     subject = 'Welcome to Project Management Portal.' 
     message = 'Thank you for being part of us. \n We are glad to have you. \n Regards \n Team Project Management' 
     # message.attach = 'filename="mypdf.pdf", content_disposition="inline", data=open("mypdf.pdf", "rb")' 
     from_email = settings.EMAIL_HOST_USER 
     to_list = [request.user.email, settings.EMAIL_HOST_USER] 
     # send_mail(subject, message, message.attach, from_email, to_list) 

     message = EmailMessage(subject, message, from_email, to_list) 
     # pdf = open('media/mypdf.pdf', 'rb') 
     message.attach_file('media/mypdf.pdf') 
     message.send() 

     return response 
else: 
    return HttpResponseNotFound('The requested pdf was not found in our server.') 
1

Вы пытаетесь использовать только send_email непосредственно, и то, что вы должны делать строит EmailMessage объект, а затем присоединить файл и отправить его. Например:

from django.core.mail import EmailMessage 
message = EmailMessage(subject, body, from_email, to_list) 
pdf = open('mypdf.pdf', 'rb') 
message.attach('mypdf.pdf', pdf, 'application/pdf') 
message.send() 

Конечно, если PDF находится на файловой системе, вы можете также просто использовать attach_file() вместо attach(). Больше информации об этом в this section документов.

+0

Я использовал ваш код но я не знаю, откуда вы получаете файл mypdf.pdf, поскольку я хочу использовать файл pdf, который я создал с помощью Reportlab. Если вы скажете m e как я могу прикрепить этот файл с mail.I обновил код выше, я пытаюсь сейчас, поэтому, пожалуйста, проверьте мой код. –

+0

Извините, я предположил, что вы сгенерировали его в файловой системе, основываясь на том, что вы пытались. Вместо использования переменной 'pdf', как я показал в своем коде, вы можете использовать свой' buf', который является файловым объектом в любом случае. – csinchok

1

Я нашел решение, все, что мне нужно было, это сохранить pdf-файл в проекте, и я сделал это с помощью SimpleDocTemplate, а затем приложил один и тот же файл, указав его местоположение. Вот что я сделал:

view:

def write_pdf_view(request): 
    doc = SimpleDocTemplate("media/mypdf.pdf", rightMargin=72, leftMargin=72, topMargin=-70) 
    styles = getSampleStyleSheet() 
    Story = [Spacer(1, 2 * inch)] 
    style = styles["Normal"] 
    paratext = ("A good thing about WeasyPrint is that you can convert a HTML document to a PDF. So you can create a regular Django template, print and format all the contents and then pass it to the WeasyPrint library to do the job of creating the pdf.") 
    p = Paragraph(paratext, style) 
    Story.append(p) 
    Story.append(Spacer(1, 0.2 * inch)) 
    doc.build(Story)  
    subject = 'Welcome to Project Management Portal.' 
    message = 'Thank you for being part of us. \n We are glad to have you. \n Regards \n Team Project Management' 
    from_email = settings.EMAIL_HOST_USER 
    to_list = [request.user.email, settings.EMAIL_HOST_USER] 
    message = EmailMessage(subject, message, from_email, to_list) 
    message.attach_file('media/mypdf.pdf') 
    message.send()  
    messages.add_message(request, messages.INFO, 'The PDF is sent Successfully !!') 
    return redirect('home') 
Смежные вопросы