Flask将PDF作为自己的页面处理

时间:2013-08-16 20:12:43

标签: python pdf web flask

对于我的个人网站,我想要一个单独的页面,仅用于我的简历,这是一个PDF。我尝试了多种方法,但我无法弄清楚如何让烧瓶处理PDF。

5 个答案:

答案 0 :(得分:28)

由于他们尝试使用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

如果您希望下载文件而不是在浏览器中显示,可以将内容处置从“内联”更改为“附件”。您也可以将此视图放在子域中,例如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的人!

答案 1 :(得分:8)

您有两种选择。您可以渲染使用静态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">

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

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

使用名为static的视图函数返回pdf。

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

答案 2 :(得分:6)

您可以在 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')

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 more关于send_from_directory

答案 3 :(得分:1)

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

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

"/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上工作,因此我必须首先在“ Web”选项卡中定义static files的路径,以便向用户显示静态文件。

答案 4 :(得分:0)

如果您尝试做典型的

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

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

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

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