如何使用FastAPI从内存缓冲区生成并返回PDF文件?
解决PyFPDF生成PDF直接从内存返回的问题
你之前的代码失败原因是将字节串传给了FileResponse,而FileResponse需要的是类文件对象(如BytesIO)或本地文件路径,而非原始字节数据。以下是两种可行的实现方式:
方式一:使用FastAPI的Response类直接返回字节内容
替换原代码中写入本地文件并返回的部分:
import io from fastapi import Response # ... 生成pdf对象的代码(user_history、create_user_pdf等逻辑不变) ... pdf = create_user_pdf(updated_history, start_date, end_date, days, errors) pdf_buff = io.BytesIO() pdf.output(pdf_buff) pdf_buff.seek(0) # 必须将缓冲区指针重置到开头,否则读取内容为空 return Response( content=pdf_buff.getvalue(), media_type="application/pdf", headers={ "Content-Disposition": "attachment; filename=report.pdf" } )
方式二:使用FileResponse传入BytesIO对象
如果偏好使用FileResponse,直接传入重置指针后的BytesIO对象即可:
import io from fastapi import FileResponse # ... 生成pdf对象的代码不变 ... pdf = create_user_pdf(updated_history, start_date, end_date, days, errors) pdf_buff = io.BytesIO() pdf.output(pdf_buff) pdf_buff.seek(0) return FileResponse( pdf_buff, media_type="application/pdf", filename="report.pdf" )
关键注意点
- 调用
pdf.output(pdf_buff)后必须执行pdf_buff.seek(0),否则缓冲区指针停在末尾,读取不到内容。 - PyFPDF的
output方法直接支持写入BytesIO对象,无需额外指定dest参数(默认会适配文件对象的写入逻辑)。
内容的提问来源于stack exchange,提问作者Ukhu
相关产品推荐
相关产品推荐

