私の個人的なWebサイトでは、履歴書用にPDFである別のページを用意します。複数の方法を試しましたが、PDFを処理するflaskを取得する方法がわかりません。
Flaskを使用してデータベースからPDFファイルを提供しようとしているため、この質問に来た人へのメモ。ファイルがデータベースに保存されるときにPDFを埋め込むのは、静的フォルダーにある場合ほど簡単ではありません。通常のようにビュー関数から単に返すのではなく、_make_response
_関数を使用して適切なヘッダーを指定し、ブラウザがバイナリ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-Dispositionを「インライン」から「添付ファイル」に変更できます。このビューをサブドメインに配置することもできます。 yourapp.com/docsではなくdocs.yourapp.com。最後のステップは、このドキュメントを実際にブラウザに埋め込むことです。任意のページで、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で作業する人を助けることを願っています!
2つのオプションがあります。静的なPDFファイルを使用するテンプレートをレンダリングするか、PDFを生成するテンプレートをレンダリングすることができます。私は個人的に最初のオプションを使用します。
これはSO PDFを返すHTMLページの作成方法に関する質問です。これをjinja2テンプレートで使用できます。
ここにそれを成し遂げるための迅速で汚い方法があります。
<embed src="http://yoursite.com/the.pdf" width="500" height="375">
または、PDFを返すために必要なすべてのヘッダーを設定するjinja2テンプレートを作成してから、
<img src="{{ url_for('static', filename='img.png', _external=True) }}" />
pdfを返すstaticというビュー関数を使用します。
2番目のオプションについて詳しくは、flask snippet をご覧ください。
5行でflask 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')
このスニペットリンク は役立つ
特定のディレクトリからファイルを送信する場合は、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')
続きを読む についてsend_from_directory
私はそれがかなり遅いことを知っています、しかし私は最も簡単な方法を見つけました、そしてそれはそれらの中にありません。
ただファイルのパスにリダイレクトハイパーリンクを含む静的ファイルとして:
"/docs/sample.pdf" #the browser will take care about showing it
または、多分よりクリーンな方法が必要な場合は、次のようなPDFのflaskページを作成しました。
@app.route('/pdf/') #the url you'll send the user to when he wants the pdf
def pdfviewer():
return redirect("/docs/sample.pdf") #the pdf itself
...これは、pdfリンクに変数名を付ける(?).
私はこの行で何かを考えています:
@app.route('/pdf<number>') #passing variable through the url
def pdfviewer(number):
if number == 1: #pdf depending on that variable
return redirect("/docs/sample1.pdf")
Elif number == 2:
return redirect("/docs/sample1.pdf")
...
else:
return "Hey I don't have such pdf" #basic html page as default
ところで:私はpythonAnywhereで作業しているので、最初に[Web]タブでstatic files
へのパスを定義する必要がありました。これにより、静的ファイルをユーザーに表示できます。
あなたがあなたの典型的なことをしようとするなら
<a href="path/doc.pdf">My Resume</a>
ユーザーがリンクをクリックしてPDFがダウンロードされる場所では、ドキュメントを静的フォルダーに配置する必要があります。
その後、あなたは次のようなものになります:
<a href="../static/doc.pdf">My Resume</a>