My problem is: I am creating a pdf file from an html, using the xhtml2pdf library. Having created the pdf file, I send the file to the user via email using the sendgrid API. However, I am not able to leave an image embedded in the pdf file, since the application returns me a "Need a valid file name!" Message. I've researched in several places but I can not find a solution. The code used is below.
HTML code:
<img src="/static/media/logo.jpg" alt="Image">
python code (convert html to pdf):
def link_callback(uri, rel):
"""
Convert HTML URIs to absolute system paths so xhtml2pdf can access those
resources
"""
# use short variable names
sUrl = settings.STATIC_URL
mUrl = settings.MEDIA_URL
mRoot = settings.MEDIA_ROOT
# convert URIs to absolute system paths
if uri.startswith(mUrl):
path = os.path.join(mRoot, uri.replace(mUrl, ""))
else:
return uri # handle absolute uri (ie: http://some.tld/foo.png)
# make sure that file exists
if not os.path.isfile(path):
raise Exception(
'media URI must start with %s or %s' % (sUrl, mUrl)
)
return path
def render_to_pdf(template_source, context_dict={}):
from io import BytesIO
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa
template = get_template(template_source)
html = template.render(context_dict)
result = BytesIO()
pdf = pisa.pisaDocument(BytesIO(html.encode("UTF-8")), result,
link_callback=link_callback, encoding='UTF-8')
if not pdf.err:
return result.getvalue()
return None
python code(send pdf file via email):
def send_mail_template(subject, template_name, context, recipient_list, from_email=<email>, attachments=None):
sg = sendgrid.SendGridAPIClient(apikey=<apikey>)
sendgrid_from_email = Email(email=from_email, name=<name>)
message_html = render_to_string(template_name, context)
content = Content("text/html", message_html)
sendgrid_to_email = Email(recipient_list[0])
mail = Mail(sendgrid_from_email, subject, sendgrid_to_email, content)
try:
if attachments is not None:
for attachment in attachments:
sendgrid_attachment = Attachment()
sendgrid_attachment.content = base64.b64encode(attachment['file']).decode()
sendgrid_attachment.content_id = attachment['filename']
sendgrid_attachment.type = attachment['type']
sendgrid_attachment.filename = attachment['filename']
sendgrid_attachment.disposition = attachment['disposition']
mail.add_attachment(sendgrid_attachment)
except Exception as err:
print(err)
response = sg.client.mail.send.post(request_body=mail.get())
return response.status_code
Error:
Need a valid file name!
'<img alt="Image" src="/static/media/logo.jpg"/>'