Flask将PDF作为自己的页面进行处理
对于我的个人网站,我想为我的简历(PDF格式)设置一个单独的页面。 我尝试了多种方法,但我无法弄清楚如何让烧瓶处理PDF。
谢谢。 如果我需要更好地解释我正在尝试做什么,请告诉我。
对于这个问题的任何人来说,因为他们试图用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!
你有两个选择。 您可以呈现使用静态PDF文件的模板,也可以呈现生成PDF的模板。 我会亲自去第一个选项。
这个SO问题致力于如何编写一个返回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。
你可以阅读更多关于这个烧瓶片段的第二个选项
您可以在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
更多信息