我已经尝试了 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 图表吗?
我遇到了同样的问题,最终只是将图形保存到图像文件,然后将图像加载到模板中,然后使用 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 样式。
我到处找,找不到任何东西。一起破解了一个对我来说非常有效的解决方案:
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 一起使用,但我相信它也可以与其他解决方案一起使用。
根据 Pyplot 本身,您不能使用非 HTML 数据格式的交互式绘图,例如PNG、JPEG、SVG 或 PDF(来源)
如果您想将图像包含在 PDF 文件中,您必须先将绘图转换为图像,然后将图像添加到 HTML 文件中,稍后使用标准工具 s.a. weasyprint 或 pdfkit。如何获取图像文件在同一来源中有说明:Python 中的静态图像导出