朋友你好
我想请你帮忙。
我需要帮助以pdf附加img文件我们使用WeasyPrint从html生成pdf。
我不知道将base_url=request.build_absolute_uri()
添加到tasks.py的位置。在文件tasks.py?
现在代替图像是空的。
我尽我所能,但我没有成功。所以请帮忙。
html文件
<!DOCTYPE html>
<html lang="en">
{% load static %}
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>
<img src="{% static 'images/static.jpg' %}" alt="">
</div>
</body>
</html>
tasks.py
from celery import task
from django.shortcuts import get_object_or_404
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMultiAlternatives
from django.conf import settings
import weasyprint
from weasyprint import default_url_fetcher, HTML
from io import BytesIO
@task
def order_created(order_id):
"""
Task to send an e-mail notification when an order is successfully created.
"""
order = Oferta.objects.get(id=order_id)
subject = 'xxx nr {}'.format(order.id)
html_content = '<p><strong>Hallow, {}!</p></strong><br><p>
email = EmailMultiAlternatives(subject,
html_content,'admin@xxx.com',
[order.email])
# generation PDF.
html = render_to_string('order/order/pdf.html', {'order': order})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
# attach PDF.
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.attach_alternative(html_content, "text/html")
email.send()
感谢您的帮助
答案 0 :(得分:1)
我通过在base64中对图像进行编码并通过上下文发送到模板,然后使用CSS进行渲染来解决了这个问题。您可以在使用HTML
之前放置您的uri定义所以,我的任务是这样的:
from django.template.loader import get_template
from weasyprint import HTML
with open("path/to/image.png", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())
context = {..., "img":encoded_string , ...}
html_template = get_template('my_template_to_PDF.html')
html = html_template.render(context).encode(encoding="UTF-8")
uri = request.build_absolute_uri()
pdf_file = HTML(string=html,base_url=uri,encoding="UTF-8").write_pdf('path/to/output.pdf')
模板:
<style>
...
div.image {
width:150px;
height:50px;
background-image:url(data:image/png;base64,{{img}});
}
...
</style>
...
<div class = 'image'></div>
...
希望它有所帮助!