2016-06-18 23 views
0

私のフラスコアプリでは、確実に印刷してapplication_base_folderに保存する前に、pdfのプレビューが表示されます。 私はtmpディレクトリにプレビューを保存できますが、それは私が本当に探しているものではありません。pdf StringIO埋め込みhtmlフラスコテンプレート

私はレポートのラボで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は

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ページで一部を更新するために、私のフォームを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上のパスを探していることでしょうか?とにかく、このエラーで「死ぬ」: UnicodeDecodeError:「ASCII」コーデックは位置11のバイト0x93をデコードすることはできません:序ない範囲内(128)

私は何かが足りない、またはそれを埋め込むには不可能です/オブジェクトをHTMLのStringIOと私は私のFS上のtmp_pathに書く必要がありますか?

答えて

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%'> 
関連する問題