pdf StringIO嵌入渲染的html烧瓶模板

时间:2016-06-18 21:45:35

标签: python html pdf flask reportlab

在我的flask-app中,我想看到生成的pdf预览,然后肯定打印并将其保存在我的application_base_folder中。 我可以在tmp目录上保存预览,但这不是我真正想要的。

我正在使用报告实验室创建pdf:

def gen_pdf(text):
    output = cStringIO.StringIO()
    c = canvas.Canvas(output)
    c.drawString(100,100, text)
    c.showPage()
    c.save()
    pdf_output=output.getvalue()
    output.close()
    return pdf_output

然后将pdf发送到带有我的表单的html模板以更新部分

class Form(wtforms.Form):
    text = TextField('text')

@app.route('/finalize/pdf/')
def finalize_pdf():
    form = Form(request.form)
    pdf_output = gen_pdf(form.text.data)
    return render_template('preview_pdf.html', form=form, pdf_output=pdf_output)

在html页面中,我有我可以更新文本的表单,POST值的按钮(它不会出现在视图finalize_pdf()中),以及pdf预览:

<form method='post' action={{ url_for('finalize_pdf') }}
{{ form.text }}
<input name='update' value='update'>
</form>
<br />
<embed src="{{ pdf_output }}" type="application/pdf" width='30%'>

这里的问题是&#34; src&#34;我猜可能正在寻找FS的路径?无论如何,它已经死了#34;有这个错误:     UnicodeDecodeError:&#39; ascii&#39;编解码器不能解码位置11中的字节0x93:序数不在范围(128)

我是否遗漏了某些东西,或者是否无法在html中嵌入/反对StringIO并且我必须在我的FS上的tmp_path中写入它?

1 个答案:

答案 0 :(得分:0)

这有点晚了但你可以使用base64编码解决这个问题:

from base64 import b64encode

# in your view:
return render_template(..., pdf_output=b64encode(pdf_output))

你的模板:

<embed src="data:application/pdf;base64,{{ pdf_output }}" type="application/pdf" width='30%'>