首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask - PyPDF2 -在内存中导出pdf文件

Flask - PyPDF2 -在内存中导出pdf文件
EN

Stack Overflow用户
提问于 2021-07-23 01:21:52
回答 2查看 84关注 0票数 0

我正在尝试从flask应用程序中导出一个pdf文件,但由于某些原因,我似乎无法正确编写它。当我导出到我的本地文件夹时,它确实起作用了,但是当我通过Flask导出时,我得到一个空白的pdf。有什么想法吗?

代码语言:javascript
复制
    pdf = PdfFileWriter()
    p1 = PdfFileReader(open(os.path.join(STATICDIR,'page1.pdf'), "rb"))
    p2 = PdfFileReader(open(os.path.join(STATICDIR,'page2.pdf'), "rb"))
    p3 = PdfFileReader(open(os.path.join(STATICDIR,'lastpage.pdf'), "rb"))

    pdf.addPage(p1.getPage(0))
    pdf.addPage(p2.getPage(0))
    pdf.addPage(p3.getPage(0))
    
    #this works
    #outputStream = open(r"output.pdf", "wb")
    #pdf.write(outputStream)

    outfile = BytesIO()
    pdf.write(outfile)

    return Response(pdf, mimetype='application/pdf',
                    headers={'Content-Disposition': 'attachment;filename=output.pdf'})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-23 02:04:00

BytesIO只是一个包含一些数据的缓冲区,它与磁盘上的任何实际文件都没有关联,它只是一块内存,其行为类似于一个文件。首先需要将PdfFileWriter()的内容写入缓冲区,然后将缓冲区的值写入pdf文件。Flask有一个整洁的函数send_file,它允许您将文件的内容发送到客户端。

代码语言:javascript
复制
from pypdf2 import PdfFileWriter
from flask import send_file

pdf = PdfFileWriter()
p1 = PdfFileReader(open(os.path.join(STATICDIR,'page1.pdf'), "rb"))
p2 = PdfFileReader(open(os.path.join(STATICDIR,'page2.pdf'), "rb"))
p3 = PdfFileReader(open(os.path.join(STATICDIR,'lastpage.pdf'), "rb"))

pdf.addPage(p1.getPage(0))
pdf.addPage(p2.getPage(0))
pdf.addPage(p3.getPage(0))
    
#this works
outputStream = open(r"output.pdf", "wb")
pdf.write(outputStream)

outfile = BytesIO()
pdf.write(outfile)

with open("output.pdf", "wb") as f:
    f.write(outfile.getvalue())

return send_file('./output.pdf', mimetype='application/pdf')
票数 2
EN

Stack Overflow用户

发布于 2021-07-24 14:59:18

感谢@darth baba,下面是干净的代码。我还添加了一个使用此方法的pptx导出:

代码语言:javascript
复制
#
#1. PDF EXPORT
#

from pypdf2 import PdfFileWriter
from flask import send_file

pdf = PdfFileWriter()
p1 = PdfFileReader(open(os.path.join(STATICDIR,'page1.pdf'), "rb"))
p2 = PdfFileReader(open(os.path.join(STATICDIR,'page2.pdf'), "rb"))
p3 = PdfFileReader(open(os.path.join(STATICDIR,'lastpage.pdf'), "rb"))

pdf.addPage(p1.getPage(0))
pdf.addPage(p2.getPage(0))
pdf.addPage(p3.getPage(0))

#this works
outputStream = open(r"output.pdf", "wb")
pdf.write(outputStream)

outfile = BytesIO()
pdf.write(outfile)
outfile.seek(0)

return send_file(outfile,
                 mimetype='application/pdf'
                 attachment_filename='output.pptx')

#
#2. PPTX EXPORT
#

from pptx import Presentation
from flask import send_file

prs = gen.GenPPT(STATICDIR, lst_ath, lst_choice_sous_cat) #creates presentation
outfile = BytesIO()
prs.save(outfile)
outfile.seek(0)

return send_file(outfile,
                 mimetype="application/vnd.openxmlformats-officedocument.presentationml.presentation",
                 as_attachment=True,
                 attachment_filename='output.pptx')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68489119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档