如何将绘图与其他 HTML 内容一起导出为 pdf?

问题描述 投票:0回答:3

我已经尝试了 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 的转换库都会在 PDF 中呈现 Plotly 图表吗?

python plotly wkhtmltopdf weasyprint xhtml2pdf
3个回答
0
投票

我遇到了同样的问题,最终只是将图形保存到图像文件,然后将图像加载到模板中,然后使用 weasyprint 进行渲染(似乎比其他解决方案更能搞乱样式)。

有关如何将图形保存到图像的信息,请参见下面的链接。

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

其他有用的链接:

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

https://weasyprint.org/samples/

view.py
的pdf渲染部分:

    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()
将允许在 HTML 文件中使用相对 URL。
presentational_hints=True
用于在 PDF 上显示的 HTML 样式。


0
投票

我到处找,找不到任何东西。一起破解了一个对我来说非常有效的解决方案:

import plotly.graph_objs as go
import plotly.io as pio

labels = ['Alice','Bob','Carl']
vals = [2,5,4]

data = [go.Bar(x=vals, y=labels, orientation='h')]

layout = go.Layout(margin_pad=10)
fig = go.Figure(data=data,layout=layout)

svg = pio.to_image(fig, format="svg")
context["svg"] = svg.decode("utf-8")

然后在模板中是这样的

<div>
{{ svg|safe }}
</div>

我尝试的第一个解决方案是让我在 plotly 的网站上生成一个 png,然后对图像进行编码,然后将其添加到图像标签等等。虽然质量很差。这个解决方案更清晰。

我将它与 weasyprint 一起使用,但我相信它也可以与其他解决方案一起使用。


0
投票

根据 Pyplot 本身,您不能使用非 HTML 数据格式的交互式绘图,例如PNG、JPEG、SVG 或 PDF(来源

如果您想将图像包含在 PDF 文件中,您必须先将绘图转换为图像,然后将图像添加到 HTML 文件中,稍后使用标准工具 s.a. weasyprint 或 pdfkit。如何获取图像文件在同一来源中有说明:Python 中的静态图像导出

© www.soinside.com 2019 - 2024. All rights reserved.