web-dev-qa-db-ja.com

Flaskを扱うPDF独自のページとして

私の個人的なWebサイトでは、履歴書用にPDFである別のページを用意します。複数の方法を試しましたが、PDFを処理するflaskを取得する方法がわかりません。

16
Stealthy Stan

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で作業する人を助けることを願っています!

33
teechap

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 をご覧ください。

9
AlexLordThorsen

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

8
M.javid

私はそれがかなり遅いことを知っています、しかし私は最も簡単な方法を見つけました、そしてそれはそれらの中にありません。

ただファイルのパスにリダイレクトハイパーリンクを含む静的ファイルとして:

"/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へのパスを定義する必要がありました。これにより、静的ファイルをユーザーに表示できます。

0
Rusca8

あなたがあなたの典型的なことをしようとするなら

<a href="path/doc.pdf">My Resume</a> 

ユーザーがリンクをクリックしてPDFがダウンロードされる場所では、ドキュメントを静的フォルダーに配置する必要があります。

その後、あなたは次のようなものになります:

<a href="../static/doc.pdf">My Resume</a>
0
Mwspencer