如何使用flask发送pdf文件以进行ajax响应?

发布于 2025-01-09 16:26:57 字数 1002 浏览 0 评论 0原文

我试图在浏览器中显示 pdf 文件而不为用户下载它。所以目前我有一个 Flask 函数,可以使用 FPDF 模块生成 pdf 文件,我需要它在新选项卡中显示给用户。

当前的flask函数是

@app.route('/pdf/create', methods=['GET', 'POST'])
def create_pdf():
    if not session.get('email'):
        return redirect(url_for('login_page'))
    email = session.get('email')
    pdf = FPDF('P', 'mm', "A4")
    pdf.add_page()
    .... pdf making ...
    pdf.output(f"pdf/mypdf.pdf")
    return send_file(f"pdf/mypdf.pdf",
                     mimetype='application/pdf',
                     attachment_filename=f"My file.pdf",
                     as_attachment=True,
                     cache_timeout=-1)

我将ajax函数称为

$("#viewFile").on("click",function(){

    $.ajax({
      url: "{{url_for('create_pdf')}}",
      type: "get",
      data: {text: mytext},
      success: function(response) {
        window.open(response);
      },
      error: function(xhr) {
        alert("Error: Failed to save notes.");
      }
    });
});

I am trying to display a pdf file in the browser without downloading it for the user. So currently I have a flask function that can generate a pdf file using FPDF module and I need it to be displayed to the user in a new tab.

The current flask function is

@app.route('/pdf/create', methods=['GET', 'POST'])
def create_pdf():
    if not session.get('email'):
        return redirect(url_for('login_page'))
    email = session.get('email')
    pdf = FPDF('P', 'mm', "A4")
    pdf.add_page()
    .... pdf making ...
    pdf.output(f"pdf/mypdf.pdf")
    return send_file(f"pdf/mypdf.pdf",
                     mimetype='application/pdf',
                     attachment_filename=f"My file.pdf",
                     as_attachment=True,
                     cache_timeout=-1)

I call the ajax function as

$("#viewFile").on("click",function(){

    $.ajax({
      url: "{{url_for('create_pdf')}}",
      type: "get",
      data: {text: mytext},
      success: function(response) {
        window.open(response);
      },
      error: function(xhr) {
        alert("Error: Failed to save notes.");
      }
    });
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一曲爱恨情仇 2025-01-16 16:26:57

使用参数as_attachment,您可以指定浏览器是否应保存文件或提供该文件以供显示。如果该值设置为False,则应显示该文件。 (请参阅文档

以下示例还向您展示了如何您可以发送 PDF 文档,无需暂时保存。
在这种情况下,不需要使用 AJAX。一个带有目标的简单锚点就可以解决问题。

Flask (app.py)
from flask import (
    Flask,
    render_template,
    send_file
)
from fpdf import FPDF
import io

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/pdf/create')
def create_pdf():
    pdf = FPDF()
    pdf.set_title('My Example PDF')
    pdf.set_author('Artist Unknown')
    pdf.set_subject('Creation of a PDF')
    pdf.add_page()
    pdf.set_font('Arial', 'B', 16)
    pdf.cell(40, 10, 'Hello World')

    stream = io.BytesIO(pdf.output(dest='S').encode('latin-1'))
    return send_file(
        stream,
        mimetype='application/pdf',
        download_name='example.pdf',
        as_attachment=False
    )
HTML (templates/index.html)
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <a href="{{ url_for('create_pdf') }}" target="_blank">Download</a>
  </body>
</html>

With the parameter as_attachment you can specify whether the browser should save the file or offer it for display. If the value is set to False, the file should be displayed. (See documentation)

The following example also shows you how you can deliver the pdf document without saving it temporarily.
The use of AJAX is not necessary in this case. A simple anchor with a target should do the trick.

Flask (app.py)
from flask import (
    Flask,
    render_template,
    send_file
)
from fpdf import FPDF
import io

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/pdf/create')
def create_pdf():
    pdf = FPDF()
    pdf.set_title('My Example PDF')
    pdf.set_author('Artist Unknown')
    pdf.set_subject('Creation of a PDF')
    pdf.add_page()
    pdf.set_font('Arial', 'B', 16)
    pdf.cell(40, 10, 'Hello World')

    stream = io.BytesIO(pdf.output(dest='S').encode('latin-1'))
    return send_file(
        stream,
        mimetype='application/pdf',
        download_name='example.pdf',
        as_attachment=False
    )
HTML (templates/index.html)
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <a href="{{ url_for('create_pdf') }}" target="_blank">Download</a>
  </body>
</html>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文