Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask handling a PDF as its own page

Tags:

For my personal website, I want to have a separate page just for my résumé, which is a PDF. I've tried multiple ways, but I can't figure out how to get flask to handle a PDF.

like image 536
Stealthy Stan Avatar asked Aug 16 '13 20:08

Stealthy Stan


People also ask

How do I upload a PDF to flask?

Python for web development using Flask Handling file upload in Flask is very easy. It needs an HTML form with its enctype attribute set to 'multipart/form-data', posting the file to a URL. The URL handler fetches file from request. files[] object and saves it to the desired location.


2 Answers

A note for anyone that came to this question because they're trying to serve PDF files from a database with Flask. Embedding a PDF when the file is stored on a database isn't as simple as when it's in the static folder. You have to use the make_response function and give it the appropriate headers so the browser knows what to do with your binary PDF data, rather than just returning it from the view function like normal. Here's some pseudocode to help:

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 

You can change the Content-Disposition from 'inline' to 'attachment' if you want the file to download rather than display in the browser. You could also put this view in a subdomain, e.g. docs.yourapp.com rather than yourapp.com/docs. The last step is to actually embed this document in the browser. On any page you'd like, just use rawrgulmuffin's strategy:

<embed src="/docs/pdfid8676etc" width="500" height="375"> 

You could even make the src dynamic with a Jinja2 template. Let's put this in doc.html (note the curly brackets):

<embed src="/docs/{{doc_id}}"> 

Then in a view function, you just return the rendered template with the appropriate 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) 

This embeds a document the user requested from a database with a simple GET request. Hope this helps anyone working with lots of PDFs in a database!

like image 131
teechap Avatar answered Nov 07 '22 21:11

teechap


You can use flask send_file or send_static_file function in 5 lines:

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 is helpful

Also can use send_from_directory if you want send file from certain 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 about send_from_directory

like image 41
M.javid Avatar answered Nov 07 '22 21:11

M.javid