pdf StringIO 嵌入呈现 html flask 模板

pdf StringIO embeded rendered html flask template

在我的 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%'>

这里的问题是 "src" 可能正在寻找 FS 上的路径,我猜?无论如何,它 "dies" 有这个错误: UnicodeDecodeError:'ascii' 编解码器无法解码位置 11 中的字节 0x93:序号不在范围内(128)

我是不是遗漏了什么,或者无法在 html StringIO 中嵌入 / object 并且我必须将它写在我的 FS 上的 tmp_path 上?

这有点晚了,但你可以使用 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%'>