使用jinja2和weasyprint在PDF渲染中忽略的图像

时间:2019-07-26 00:48:50

标签: python image pdf jinja2 weasyprint

我正在用python运行一个分析脚本,该脚本为我提供了一些变量和保存为png文件的图像。然后,我使用jinja2将它们填充到html模板中,然后使用weasyprint将html呈现为我保存的PDF文件。

关于此问题,这里有很多问题,但是没有建议的解决方案可以解决我的问题。我需要将其提供给图像的绝对路径,因为输出数据将保存在与生成它的代码完全不同的本地磁盘上。提供的许多解决方案都建议使用request.base_url()之类的东西,但这似乎是来自flask的东西(我想是吗?),或者实际上是在构建应用程序而不是简单地构建PDF文件的东西。

从变量生成PDF文件的函数如下所示:

def create_pdf_report(varlist, outfile):

    # Create Jinja environment and get template
    from jinja2 import Environment, FileSystemLoader
    env = Environment(loader=FileSystemLoader('<absolute-path-to-dir-with-template>'))
    template = env.get_template('report_template.html')

    # Render HTML with input variables
    html_out = template.render(varlist)

    # Generate PDF
    from weasyprint import HTML
    HTML(string=html_out).write_pdf(outfile)

模板是这样的:

<img src="{{ systematics_figure }}" alt="systematics" width="900" height="650">

我传入的varlist字典如下:

fig3_fname = '<absolute-path-to-image>'
varlist = {'systematics_figure': fig3_fname}

虽然我给它的普通变量可以很好地显示,但图像不显示;我得到的是alt文字。该过程完成得很好,但是我无法显示png图像。当我将绝对图像路径直接粘贴到html文件中并在浏览器中打开它时,它看起来不错。

我该怎么做才能使这项工作成功?

我正在使用macOS Sierra 10.12.6,并且正在python 3.7.3中工作。

1 个答案:

答案 0 :(得分:2)

原来的解决方案是在base_url='.'中添加weasyprint.HTML()

HTML(string=html_out, base_url='.').write_pdf(outfile)

并使用png个文件代替pdf个数字。