23

对于我的个人网站,我想为我的简历设置一个单独的页面,即 PDF。我尝试了多种方法,但我不知道如何让烧瓶处理 PDF。

4

5 回答 5

43

给遇到此问题的任何人的说明,因为他们正在尝试使用 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 从“内联”更改为“附件”。您也可以将此视图放在子域中,例如 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 的人!

于 2013-12-22T18:04:22.317 回答
13

您可以在5行中使用烧瓶send_filesend_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

于 2015-05-19T11:19:47.607 回答
9

你有两个选择。您可以渲染使用静态 PDF 文件的模板或渲染生成 PDF 的模板。我个人会选择第一个选项。

这个 SO question 专门讨论如何编写返回 PDF 的 HTML 页面。您可以在您的 jinja2 模板中使用它。

这是完成它的一种快速而肮脏的方法。

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

或者,您可以创建一个 jinja2 模板,该模板设置返回 PDF 所需的所有标题,然后说,

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

带有一个名为 static 的视图函数,它返回 pdf。

您可以在此烧瓶片段中阅读有关第二个选项的更多信息

于 2013-08-16T20:24:22.420 回答
3

我知道已经很晚了,但我只是找到了最简单的方法,而且不在其中。

只需将文件的路径作为静态文件重定向到任何超链接:

"/docs/sample.pdf" #the browser will take care about showing it

或者,如果您想要一种更清洁的方式……我刚刚为 pdf 制作了一个烧瓶页面,如下所示:

@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 链接(?)提供一个变量名,如果我需要根据变量将用户发送到不同的 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,所以我必须首先static files在 Web 选项卡中定义路径,这样我才能向用户显示静态文件。

于 2020-03-15T07:52:23.767 回答
0

如果你试图做你的典型

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

在用户单击链接并下载 pdf 的地方,您需要将文档放在静态文件夹中。

然后你最终会得到类似的东西:

<a href="../static/doc.pdf">My Resume</a>
于 2018-03-21T17:23:13.980 回答