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

Ste*_*tan 14 python pdf flask web

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

谢谢.如果我需要更好地解释我想要做什么,请告诉我.

小智 30

这个问题的任何人都应该注意,因为他们正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

如果您希望下载文件而不是在浏览器中显示,则可以将内容处置从"内联"更改为"附件".您也可以将此视图放在子域中,例如docs.yourapp.com而不是yourapp.com/docs.最后一步是将此文档实际嵌入浏览器中.在您想要的任何页面上,只需使用rawrgulmuffin的策略:

<embed src="/docs/pdfid8676etc" width="500" height="375">
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用Jinja2模板使src动态化.我们把它放在doc.html中(注意大括号):

<embed src="/docs/{{doc_id}}">
Run Code Online (Sandbox Code Playgroud)

然后在视图函数中,您只需使用适当的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)
Run Code Online (Sandbox Code Playgroud)

这通过简单的GET请求嵌入用户从数据库请求的文档.希望这可以帮助任何在数据库中处理大量PDF的人!


Ale*_*sen 9

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

这个SO问题专门用于编写返回PDF的HTML页面.您可以在jinja2模板中使用它.

这是一个快速而肮脏的方法来完成它.

<embed src="http://yoursite.com/the.pdf" width="500" height="375">
Run Code Online (Sandbox Code Playgroud)

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

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

使用一个名为static的视图函数返回pdf.

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


M.j*_*vid 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')
Run Code Online (Sandbox Code Playgroud)

此代码段链接很有帮助

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')
Run Code Online (Sandbox Code Playgroud)

了解更多send_from_directory

  • 我知道这是几年后的事了,但我的代码是``server_bp.route('/resume') defresume(): return send_file('static/pdf/resume.pdf',attachment_filename='resume.pdf')`` ` 效果很好。我发现这个答案最有帮助,但我不确定“with open”是您想要的方式。他们的浏览器将显示 pdf。您不希望服务器打开该文件。 (2认同)