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