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

Iva*_*nja 1 python pdf image 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)
Run Code Online (Sandbox Code Playgroud)

模板是这样的:

<img src="{{ systematics_figure }}" alt="systematics" width="900" height="650">
Run Code Online (Sandbox Code Playgroud)

varlist我传入的字典是这样的:

fig3_fname = '<absolute-path-to-image>'
varlist = {'systematics_figure': fig3_fname}
Run Code Online (Sandbox Code Playgroud)

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

我能做些什么来完成这项工作?

我在 macOS Sierra 10.12.6 上使用 python 3.7.3。

Iva*_*nja 7

原来的解决办法是添加base_url='.'weasyprint.HTML()

HTML(string=html_out, base_url='.').write_pdf(outfile)
Run Code Online (Sandbox Code Playgroud)

并使用png文件而不是pdf数字。