Skip to main content
 首页 » 编程设计

python之在 PDF Django Weasyprint 中附加 img 文件

2024年10月01日28zdz8207

你好 friend

我想请你帮忙。

我需要帮助在 pdf 中附加 img 文件,我们使用 Wea​​syPrint 从 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() 

非常感谢你的帮助

请您参考如下方法:

我通过将图像编码为 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> 
... 

希望对您有所帮助!