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

선풍기*_*선풍기 4 html python pdf django weasyprint

我正在尝试使用Weasyprint库在Django上输出PDF,但是图像不会出现在生成的PDF上。我已经尝试了图像的相对URL和静态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
Run Code Online (Sandbox Code Playgroud)

这是图像HTML的一部分:

<DIV id="p1dimg1">
<IMG src="{% static 'img/image.jpg' %}" alt="">
</DIV>
Run Code Online (Sandbox Code Playgroud)

和CSS:

#page_1 #p1dimg1 {position:absolute;top:0px;left:0px;z-
index:-1;width:792px;height:1111px;}
#page_1 #p1dimg1 #p1img1 {width:792px;height:1111px;}
Run Code Online (Sandbox Code Playgroud)

非常感谢你

선풍기*_*선풍기 13

固定于:

添加, base_url=request.build_absolute_uri()这样

html = HTML(string=html_string)
Run Code Online (Sandbox Code Playgroud)

变成

html = HTML(string=html_string, base_url=request.build_absolute_uri())
Run Code Online (Sandbox Code Playgroud)

这将允许在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);
Run Code Online (Sandbox Code Playgroud)

  • 对于 JPG 图像,安装 gdk-pixbuf 包解决了我的问题。对于 Ubuntu sudo apt-get install libgdk-pixbuf2.0-0 (3认同)

Jon*_*nny 8

添加HTML(string=html_string, base_url=request.build_absolute_uri())到我的配置后,图像仍然无法加载。必须使用下面的日志记录来识别真正的问题。

import logging
logger = logging.getLogger('weasyprint')
logger.addHandler(logging.FileHandler('/tmp/weasyprint.log'))
Run Code Online (Sandbox Code Playgroud)

然后检查/tmp/weasyprint.log日志文件是否有错误。

对我来说真正的问题是:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate
Run Code Online (Sandbox Code Playgroud)

修复方法是禁用 ssl 验证:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate
Run Code Online (Sandbox Code Playgroud)


Abd*_*man 6

将图像路径的静态设置为:

{% load static %}
<img src="{% static 'images/your_image.png %}" alt="" />
Run Code Online (Sandbox Code Playgroud)

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

HTML(string=html_string, base_url=request.build_absolute_uri())
Run Code Online (Sandbox Code Playgroud)