2013-08-16 57 views
8

Đối với trang web cá nhân của tôi, tôi muốn có một trang riêng cho bản lý lịch của tôi, đó là một tệp PDF. Tôi đã thử nhiều cách, nhưng tôi không thể tìm ra cách lấy bình để xử lý PDF.Bình xử lý PDF dưới dạng trang riêng của mình

Cảm ơn. Hãy cho tôi biết nếu tôi cần giải thích rõ hơn những gì tôi đang cố gắng làm.

+0

Bạn có thể yêu cầu máy chủ web phân phát tệp tĩnh (như bạn có thể đang làm cho tệp '/ static' của mình). Nếu có, bạn có thể tạo liên kết trong ứng dụng Flask của mình với tệp tĩnh không? –

Trả lời

4

Bạn có hai tùy chọn. Bạn có thể hiển thị mẫu sử dụng tệp PDF tĩnh hoặc hiển thị mẫu tạo PDF. Cá nhân tôi đi với tùy chọn đầu tiên.

This SO question is dedicated to how to write an HTML page that returns a PDF. You can use this in your jinja2 template.

Đây là cách nhanh chóng và dơ bẩn để hoàn thành công việc.

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

Hoặc, bạn có thể tạo một mẫu jinja2 mà tập hợp tất cả các tiêu đề yêu cầu phải trả lại một PDF và sau đó nói,

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

với một cái nhìn chức năng gọi là tĩnh mà trả về pdf.

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

+0

Với 'cách nhanh chóng và bẩn thỉu', src có thể là tài liệu pdf trong thư mục gốc của chương trình của tôi hay nó phải liên kết tới một URL? Cảm ơn! –

+0

Nó có thể chỉ là pdf. [bạn có thể sử dụng đường dẫn tương đối từ bất kỳ thư mục nào mà mẫu được gọi từ] (http://stackoverflow.com/questions/7503130/relative-path-or-url-for-html-src-and-href-attributes). Vì vậy, nếu cấu trúc của bạn là 'app-> templates-> PDFTemplate.html' và tệp của bạn nằm trong' app-> pdf.pdf' thì bạn có thể nói 'src =" ../ pdf.pdf "'. – AlexLordThorsen

20

Một lưu ý cho bất cứ ai đến câu hỏi này bởi vì họ đang cố gắng để phục vụ tập tin PDF từ một cơ sở dữ liệu với Flask. Nhúng PDF khi tệp được lưu trữ trên cơ sở dữ liệu không đơn giản như khi nó nằm trong thư mục tĩnh. Bạn phải sử dụng hàm make_response và cung cấp cho nó tiêu đề thích hợp để trình duyệt biết phải làm gì với dữ liệu PDF nhị phân của bạn, thay vì chỉ trả lại từ chức năng xem như bình thường. Dưới đây là một số giả để giúp:

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 

Bạn có thể thay đổi Content-Disposition từ 'inline' thành 'đính kèm' nếu bạn muốn các tập tin tải chứ không phải hiển thị trong trình duyệt. Bạn cũng có thể đặt chế độ xem này trong tên miền phụ, ví dụ: docs.yourapp.com thay vì yourapp.com/docs. Bước cuối cùng là thực sự nhúng tài liệu này vào trình duyệt. Trên bất kỳ trang nào bạn muốn, chỉ cần sử dụng chiến lược rawrgulmuffin:

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

Bạn thậm chí có thể làm cho src động với mẫu Jinja2. Hãy đặt này trong doc.html (chú ý dấu ngoặc nhọn):

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

Sau đó, trong một chức năng xem, bạn chỉ cần trả lại mẫu render với doc_id thích hợp:

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) 

này nhúng một tài liệu các người dùng được yêu cầu từ cơ sở dữ liệu với yêu cầu GET đơn giản. Hy vọng điều này sẽ giúp bất kỳ ai làm việc với nhiều tệp PDF trong cơ sở dữ liệu!

+0

make_response đưa ra một lỗi: TypeError: đối tượng 'file' không thể gọi được | Điều gì có thể sai ? – moaglee

3

Bạn có thể sử dụng bình send_file hoặc send_static_file chức năng trong dòng:

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 là hữu ích

Cũng có thể sử dụng send_from_directory nếu bạn muốn gửi tập tin từ thư mục nhất định:

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 về send_from_directory

+0

Sẽ tốt hơn nếu sử dụng 'with' để mở tệp, đảm bảo tệp được đóng sau khi sử dụng. –

+0

Ok, Cảm ơn @ Audrius-Kažukauskas – Mohsen