kuyoro 2024-03-02 14:51 采纳率: 90.5%
浏览 14
已结题

python flask 如果通过读取pdf下载地址直接显示

有一个远程pdf链接地址,想通过python现在然后通过浏览器(chrome,edge)直接在页面上显示,以下是flask路由页面,但无法成功,pdf是可以预览,应该是代码问题,请教该怎么解决呢?

from flask import Blueprint,Flask, send_file, Response
import requests

pdf_stream = Blueprint('pdf_stream', __name__)

@pdf_stream.route('/pdf_stream/')
def main():
    # 替换为你的PDF URL
    pdf_url = 'https://stock.tianyancha.com/Announcement/eastmoney/1ed8139105f360d39b9db56fac2506e6.pdf'
    
    try:
        # 使用requests库获取PDF内容
        response = requests.get(pdf_url, stream=True)
        
        # 检查请求是否成功
        if response.status_code == 200:
            # 使用send_file发送PDF文件
            return send_file(Response(response.content), mimetype='application/pdf')
        else:
            # 如果请求失败,返回错误信息
            return 'Failed to retrieve PDF', 500
    except requests.RequestException as e:
        # 如果发生网络错误,返回错误信息
        return 'Error occurred while retrieving PDF: {}'.format(e), 500

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-02 14:51
    关注

    引自免费微信小程序:皆我百晓生

    在您的 Flask 应用中,您尝试通过读取远程 PDF 链接并将其内容作为响应发送给浏览器以实现在线预览。但您在代码中将 Responsesend_file 混合使用了,这导致了问题。实际上,您可以直接使用 Response 对象,并设置正确的 headers 来显示 PDF。以下是修正后的代码:

    from flask import Blueprint, make_response
    import requests
    
    pdf_stream = Blueprint('pdf_stream', __name__)
    
    @pdf_stream.route('/pdf_stream/')
    def main():
        # 替换为你的PDF URL
        pdf_url = 'https://stock.tianyancha.com/Announcement/eastmoney/1ed8139105f360d39b9db56fac2506e6.pdf'
        
        try:
            # 使用requests库获取PDF内容
            response = requests.get(pdf_url, stream=True)
            
            # 检查请求是否成功
            if response.status_code == 200:
                # 创建一个新的Flask Response对象,设置content、mimetype和headers
                response_to_send = make_response(response.content)
                response_to_send.mimetype = 'application/pdf'
                
                # 设置强制浏览器下载或在线预览的header
                # 若要在线预览(而不是下载),请注释掉下面这行的'Content-Disposition'部分
                response_to_send.headers["Content-Disposition"] = "inline; filename=remote_pdf.pdf"
    
                return response_to_send
            else:
                # 如果请求失败,返回错误信息
                return 'Failed to retrieve PDF', 500
        except requests.RequestException as e:
            # 如果发生网络错误,返回错误信息
            return 'Error occurred while retrieving PDF: {}'.format(e), 500
    

    上述代码首先从远程地址获取PDF内容,然后创建一个 Flask 的 make_response 对象,并设置其 mimetype 为 'application/pdf'。同时设置了 Content-Disposition 头部来控制浏览器的行为:如果想要用户直接在浏览器中预览PDF,则设置为 'inline';如果希望用户下载该文件,则可以改为 'attachment'

    另外,请确保您的浏览器支持内嵌显示PDF文件。对于大部分现代浏览器来说,默认是支持的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 已采纳回答 3月2日
  • 创建了问题 3月2日