Вывод PDF с использованием Weasyprint без отображения изображений (Django)

Я пытаюсь вывести PDF-файл на Django с помощью библиотеки Weasyprint, но изображения не отображаются в сгенерированном PDF-файле. Я пробовал как относительные, так и статические URL-адреса для изображений, но даже статический URL-адрес не показывает изображение. При открытии самого HTML в хроме изображения отображаются.

Вот мое представление генерации PDF в файле views.py:

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="">
</DIV>

И 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;}

Большое тебе спасибо


person 선풍기    schedule 26.02.2018    source источник


Ответы (4)


Исправлено:

Добавьте base_url=request.build_absolute_uri(), чтобы

html = HTML(string=html_string)

становится

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

Это позволит использовать относительные URL-адреса в файле HTML.

Для изображений по какой-то причине работают только изображения PNG.

Чтобы стили HTML отображались в PDF, добавьте Presentational_hints=True в соответствии с документацией Weasyprint:

    pdf = html.write_pdf(stylesheets=[CSS(settings.STATIC_ROOT +  '/css/detail_pdf_gen.css')], presentational_hints=True);
person 선풍기    schedule 26.02.2018
comment
Вопрос в том, почему JPG не работает. ПНГ работает нормально. - person Braulio Soncco; 03.04.2020
comment
Это та часть, которая мне помогла. Для изображений по какой-то причине работают только изображения PNG. - person Scott Warren; 25.05.2021

Настройте static для пути вашего изображения как:

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

а затем вам нужно передать base_url в HTML-классе Weasyprint как:

HTML(string=html_string, base_url=request.build_absolute_uri())
person Abdul Rehman    schedule 12.03.2018
comment
попробовал ваше решение, но получил ошибку unorderable types: str() › float() - person Null Pointer; 05.07.2018

После добавления HTML(string=html_string, base_url=request.build_absolute_uri()) в мою конфигурацию изображения по-прежнему не загружались. Пришлось использовать регистрацию ниже, чтобы определить реальную проблему.

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

Затем проверьте /tmp/weasyprint.log файл журнала на наличие ошибок.

Настоящей проблемой для меня было:

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

Исправление заключалось в отключении проверки ssl:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context
person Jonny    schedule 21.10.2020

Я не знаю Weasyprint, но я использую Pisa, и это работает очень хорошо с изображениями в формате 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, ""))

Мой PDF-файл создается из файла .html, и у меня есть такая картинка:

<html>
    <head>
    {% 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>

    <body>

        <img src="{{MEDIA_ROOT}}Logo/logo.jpeg" width="250" height="66"/>
        <br></br>
        ...
person Essex    schedule 26.02.2018
comment
Я возился с кодом, пока у меня не возникли серьезные сомнения в себе, и я попробовал другие изображения, и, похоже, отображаются только изображения png. Возможно, это неправильный css, или мне просто нужно преобразовать все изображения в png. Спасибо за ответ! - person 선풍기; 26.02.2018
comment
В порядке. Это странно, но год назад я искал хороший способ получить PDF с картинками, и Pisa с html2pdf кажется лучшим инструментом для этого ;) У меня нет никаких проблем, и он отлично работает. Если мой ответ помог вам, не стесняйтесь голосовать. - person Essex; 26.02.2018