2013-08-16 4 views
8

私の個人的なウェブサイトでは、私の履歴書のためだけに別のページが必要です。これはPDFです。私は複数の方法を試しましたが、フラスコにPDFを処理する方法を理解できません。フラスコ独自のページとしてP​​DFを扱う

ありがとうございました。私が何をしようとしているのかをよりよく説明する必要があるかどうかを教えてください。

+0

ファイルを静的に提供するようにWebサーバーを取得できますか(とにかくあなたの '/ static'ファイルのためにやっているように)。もしそうならば、Flaskアプリケーションの静的ファイルへのリンクを作成するだけですか? –

答えて

4

2つのオプションがあります。静的PDFファイルを使用するテンプレートをレンダリングするか、PDFを生成するテンプレートをレンダリングすることができます。私は個人的に最初の選択肢に行くだろう。

This SO question is dedicated to how to write an HTML page that returns a PDF. You can use this in your jinja2 template.

ここでそれを成し遂げるために迅速かつ汚い方法です。

<embed src="http://yoursite.com/the.pdf" width="500" height="375"> 

または、PDFを返すstaticというビュー機能でPDFを返すために必要なすべてのヘッダを設定しますJinja2のテンプレートを作成してから言って、

<img src="{{ url_for('static', filename='img.png', _external=True) }}" /> 

ことができます。

You can read more about the second option at this flask snippet

+0

「迅速で汚い方法」では、srcは自分のプログラムのフォルダのルートにあるpdfドキュメントに過ぎないのでしょうか、それともURLにリンクする必要がありますか?ありがとう! –

+0

それはちょうどpdfであることができます。 [テンプレートを呼び出すフォルダからの相対パスを使用することができます](http://stackoverflow.com/questions/7503130/relative-path-or-url-for-html-src-and-href-attributes)。したがって、あなたの構造が 'app-> templates-> PDFTemplate.html'であり、あなたのファイルが' app-> pdf.pdf'であれば 'src =" ../pdf.pdf "'と言うことができます。 – AlexLordThorsen

20

彼らはフラスコでデータベースからPDFファイルを提供しようとしているので、この質問に来た人のためのノート。ファイルがデータベースに格納されているときにPDFを埋め込むことは、静的フォルダにあるときほど簡単ではありません。 関数を使用して、適切なヘッダーを与えて、ブラウザーがバイナリーPDFデータの処理方法を知っていて、通常のようなビュー関数から返すのではなく、ここに助けるためにいくつかの擬似コードです:

from flask import make_response 

@app.route('/docs/<id>') 
def get_pdf(id=None): 
    if id is not None: 
     binary_pdf = get_binary_pdf_data_from_database(id=id) 
     response = make_response(binary_pdf) 
     response.headers['Content-Type'] = 'application/pdf' 
     response.headers['Content-Disposition'] = \ 
      'inline; filename=%s.pdf' % 'yourfilename' 
     return response 

ファイルがダウンロードではなく、ブラウザで表示したい場合は、「添付ファイル」から「インライン」からのContent-処分を変更することができます。このビューをサブドメインに配置することもできます(例: docs.yourapp.comではyourapp.com/docsではなく最後のステップは、この文書を実際にブラウザに埋め込むことです。あなたがしたい任意のページで、ちょうどrawrgulmuffinの戦略を使用します。

<embed src="/docs/pdfid8676etc" width="500" height="375"> 

をあなたもJinja2のテンプレートを使用してsrcが動的に作ることができます。のは、(中括弧に注意してください)doc.htmlでこれを入れてみましょう:

<embed src="/docs/{{doc_id}}"> 

次にビュー機能で、あなただけの適切なDOC_IDでレンダリングテンプレートを返す:

from flask import render_template 

@app.route('/<id>') 
def show_pdf(id=None): 
    if id is not None: 
     return render_template('doc.html', doc_id=id) 

これは、文書に埋め込みます単純なGET要求でデータベースから要求されたユーザー。これは、データベース内の多くのPDFを扱っている人に役立ちます。

+0

make_responseはエラーを返します:TypeError: 'file'オブジェクトは呼び出し不可能です。何が間違っているのでしょうか? – moaglee

3

あなたがラインにフラスコsend_fileまたはsend_static_file機能を使用することができ :

from flask import send_file, current_app as app 

@app.route('/show/static-pdf/') 
def show_static_pdf(): 
    with open('/path/of/file.pdf', 'rb') as static_file: 
     return send_file(static_file, attachment_filename='file.pdf') 

This snippet linkは便利です

あなたが特定のディレクトリからファイルを送信したい場合にもsend_from_directoryを使用することができます。

from flask import send_from_directory, current_app as app 

@app.route('/show/PDFs/') 
def send_pdf(): 
    return send_from_directory(app.config['UPLOAD_FOLDER'], 'file.pdf') 

read moresend_from_directory

+0

ファイルを開くには 'with'を使う方が良いでしょう。これは、使用後にファイルが閉じられていることを確認します。 –

+0

ありがとう、@ Audrius-Kažukauskas – Mohsen

関連する問題