You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Flask在<object>标签中展示PyMuPDF处理的内存文档?

无需保存文件,在Flask中通过展示PyMuPDF处理后的内存文档

完全可以做到——核心思路是让Flask的路由直接返回PyMuPDF处理后的文档字节流,然后让HTML的<object>标签直接指向这个路由的URL,全程不需要将文档保存到本地文件。

实现步骤与代码示例

1. Flask后端逻辑

利用PyMuPDF的Document.write()方法直接生成文档字节串,再通过Flask的Response对象返回这个字节流,同时设置正确的HTTP头让浏览器识别文档类型并在页面内展示:

from flask import Flask, Response
import fitz  # PyMuPDF

app = Flask(__name__)

@app.route('/processed-doc')
def serve_processed_doc():
    # 1. 用PyMuPDF处理文档(示例:创建新文档并添加内容)
    doc = fitz.open()
    page = doc.new_page(width=600, height=800)
    page.insert_text((50, 50), "PyMuPDF处理后的文档内容", fontsize=24)
    # 这里可以添加你的实际处理逻辑:修改已有页面、插入图片、合并文档等
    
    # 2. 将处理后的文档导出为字节流(无需保存到文件)
    doc_bytes = doc.write()
    doc.close()
    
    # 3. 返回字节流,设置响应头
    return Response(
        doc_bytes,
        mimetype='application/pdf',  # 对应文档类型,PDF用这个,其他格式需调整
        headers={'Content-Disposition': 'inline; filename="processed.pdf"'}
    )

@app.route('/')
def index():
    # 返回包含<object>标签的页面
    return '''
    <html>
        <body style="margin: 0;">
            <object 
                data="/processed-doc" 
                type="application/pdf" 
                width="100vw" 
                height="100vh"
            >
                你的浏览器不支持PDF预览,请<a href="/processed-doc">点击下载文档</a>
            </object>
        </body>
    </html>
    '''

if __name__ == '__main__':
    app.run(debug=True)

2. 关键细节说明

  • PyMuPDF字节流生成:doc.write()方法默认返回文档的字节串,不需要传入文件路径,直接在内存中完成转换。
  • 响应头设置:
    • mimetype要匹配文档类型:比如PDF用application/pdf,XPS用application/vnd.ms-xpsdocument,EPUB用application/epub+zip。
    • Content-Disposition设为inline,告诉浏览器尝试在页面内展示文档,而不是直接触发下载。
  • 标签配置:data属性直接指向处理文档的路由URL,type属性和后端的mimetype保持一致即可。

    注意事项

    • 如果处理超大文档,需要注意内存占用问题,必要时可以分块返回,但大部分常规场景下直接返回字节流足够用。
    • 部分旧浏览器对<object>的PDF支持有限,添加降级下载链接可以提升兼容性。

    内容的提问来源于stack exchange,提问作者Clement Genninasca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:09:24