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

标签 python django pdf weasyprint

你好 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>
...

希望对您有所帮助!

关于python - 在 PDF Django Weasyprint 中附加 img 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44720474/

相关文章:

python - matplotlib 中图形的意外叠加

Python二进制文件读取问题

python - 将不在模型中的字段添加到 Django ModelForm

python - Django:按用户过滤 ModelChoiceField

java - 如何在不下载的情况下从 url 读取 pdf?

php - 使用 Ghostscript 时禁止旋转 PDF 中的页面

python - Django CSRF 验证失败。网络钩子(Hook)支付系统

python - 打印空行Python的函数

python - 在管理页面中编辑 M2M 的两侧

mysql - 显示从数据库保存的 PDF 文件到 PDFVIEWER