使用Weasyprint输出的PDF不显示图像(Django)。

22 人关注

我正在尝试使用Weasyprint库在Django上输出PDF,但图像没有出现在生成的PDF上。我已经尝试了图片的相对和静态URL,但即使是静态URL也不显示图片。当在chrome上打开HTML本身时,图像确实显示了。

这里是我在views.py文件中的pdf生成视图。

def pdf_generation(request, some_slug)
    stud = Student.objects.get(some_slug=some_slug)
    studid = stud.some_slug
    context = {'studid':studid}
    html_string = render_to_string('templates/pdf_gen.html', context)
    html = HTML(string=html_string)
    pdf = html.write_pdf(stylesheets=[CSS(settings.STATIC_ROOT +  '/css/detail_pdf_gen.css')]);
    response = HttpResponse(pdf, content_type='application/pdf')
    response['Content-Disposition'] = 'inline; filename="mypdf.pdf"'
    return response

这里是图片的HTML部分。

<DIV id="p1dimg1">
<IMG src="{% static 'img/image.jpg' %}" alt="">

还有CSS。

#page_1 #p1dimg1 {top:0px;left:0px;z-
index:-1;width:792px;height:1111px;}
#page_1 #p1dimg1 #p1img1 {width:792px;height:1111px;}

非常感谢您

python
html
django
pdf
weasyprint
선풍기
선풍기
发布于 2018-02-26
5 个回答
선풍기
선풍기
发布于 2022-03-20
已采纳
0 人赞同

Fixed by:

Add base_url=request.build_absolute_uri() so that

html = HTML(string=html_string)

becomes

html = HTML(string=html_string, base_url=request.build_absolute_uri())

这将允许在HTML文件中使用相对的URL。

对于图片,由于某种原因,似乎只有PNG图片可以工作。

为了使HTML样式显示在PDF上,按照Weasyprint的文档,添加presentational_hints=True。

    pdf = html.write_pdf(stylesheets=[CSS(settings.STATIC_ROOT +  '/css/detail_pdf_gen.css')], presentational_hints=True);
    
The questions is, why JPG doesn't work. PNG works fine.
这是对我有帮助的部分,"对于图像,由于某些原因,似乎只有PNG图像可以工作"。
如果是JPG图片,安装gdk-pixbuf包可以解决我的问题。对于Ubuntu,sudo apt-get install libgdk-pixbuf2.0-0
Abdul Rehman
Abdul Rehman
发布于 2022-03-20
0 人赞同

将你的图像的路径设置为静态。

{% load static %}
<img src="{% static 'images/your_image.png %}" alt="" />

然后你必须在Weasyprint的HTML类中传递base_url为。

HTML(string=html_string, base_url=request.build_absolute_uri())
    
tried your solution but getting error unorderable types: str() > float()
Jonny
Jonny
发布于 2022-03-20
0 人赞同

在我的配置中加入 HTML(string=html_string, base_url=request.build_absolute_uri()) 后,图像仍然无法加载。不得不使用下面的日志来确定真正的问题。

import logging
logger = logging.getLogger('weasyprint')
logger.addHandler(logging.FileHandler('/tmp/weasyprint.log'))

Then check /tmp/weasyprint.log log file for errors.

对我来说,真正的问题是。

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate

修复方法是禁用ssl验证。

import ssl
ssl._create_default_https_context = ssl._create_unverified_context
    
上面提到的所有答案都不成功。这个答案帮助我看到,我也可以使用外部CSS,而不必使用 stylesheets=[CSS(...)]
Essex
Essex
发布于 2022-03-20
0 人赞同

我不知道Weasyprint,但我在用 比萨 而且它在将图片转化为PDF输出时效果非常好。

例如: :

def PDFGeneration(request) :
    var1 = Table1.objects.last()
    var2 = Table2.objects.last()
    data = {"key1" : variable1, "key2" : variable2}
    html = get_template('My_template_raw.html').render(data)
    result = StringIO()
    with open(path, "w+b") as file :
      pdf = pisa.pisaDocument(StringIO(html), file, link_callback=link_callback)
      file.close()
      image_data = open(path, "rb").read()
      return HttpResponse(image_data, content_type="application/pdf")
    return render(request, 'HTML template', context)
def link_callback(uri, rel):
    if uri.find('chart.apis.google.com') != -1:
        return uri
    return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))

My PDF is generated from an .html file 和I have my picture like this :

{% load staticfiles %} {% load static %} <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="{% static 'css/MyFile.css' %}"/> <style> body { font-family: Courier New, Courier, monospace; text-align: justify; list-style-type: none; </style> </head> <img src="{{MEDIA_ROOT}}Logo/logo.jpeg" width="250" height="66"/> <br></br>