Как экспортировать графики в формате PDF вместе с другим содержимым HTML?

Я пробовал 3 библиотеки для преобразования HTML в PDF, т.е. xhtml2pdf, weasyprint и wkhtmltopdf.

В мой HTML-код включены графические изображения, они являются автономными графиками, т.е. графики, созданные из plotly.offline.plots

Когда я загружаю тот же HTML-код в браузер, графики и другое HTML-содержимое отображаются хорошо, но при его преобразовании в PDF с использованием любой из упомянутых выше библиотек содержимое HTML отображается хорошо, но график становится пустым внутри PDF.

from plotly.graph_objs import Scatter
from plotly.offline import plot

fig = plot([Scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])], output_type='div')

Я передаю этот фиг в шаблон Django и визуализирую его как

{{ fig|safe }}

Использовали xhtml2pdf, weasyprint и wkhtmltopdf для преобразования HTML в PDF, но ни один из них не отображал графики.

Что мне не хватает в моем коде? Может ли кто-нибудь сказать мне, будет ли какая-либо из библиотек преобразования HTML в PDF отображать графики Plotly в PDF?


person K2A    schedule 25.07.2020    source источник
comment
У меня та же проблема с использованием wkhtmltopdf, я хотел добавить, я запускаю код в Windows 10. В то время как другие разработчики, работающие над ubuntu, похоже, заставляют его работать.   -  person Alex_H    schedule 10.08.2020


Ответы (1)


У меня была такая же проблема, в конце концов, я просто сохранил фигуру в файл изображения, затем загрузил изображение в шаблон, а затем отрисовал его с помощью weasyprint (похоже, что стиль меньше, чем другие решения).

См. Ссылку ниже о том, как сохранить фигуру в изображение.

https://plotly.com/python/static-image-export/

Другие полезные ссылки:

https://weasyprint.readthedocs.io/en/latest/features.html#html

https://weasyprint.org/samples/

Часть рендеринга pdf view.py:

    html_string = render_to_string('management/report_template.html', context)
    html = HTML(string=html_string, base_url=request.build_absolute_uri())
    result = html.write_pdf(presentational_hints=True)

    # Creating http response
    response = HttpResponse(content_type='application/pdf;')
    response['Content-Disposition'] = 'inline; filename=report.pdf'
    response['Content-Transfer-Encoding'] = 'binary'
    with tempfile.NamedTemporaryFile(delete=True) as output:
        output.write(result)
        output.flush()
        output = open(output.name, 'rb')
        response.write(output.read())

    return response

base_url=request.build_absolute_uri() позволит использовать относительные URL-адреса в файле HTML. presentational_hints=True Для отображения стилей HTML в PDF.

person Jonny    schedule 10.10.2020