Flask:使用reportlab生成预览PDF

2024-04-20 09:49:19 发布

您现在位置:Python中文网/ 问答频道 /正文

有了Flask,我将发送附有xml和pdf的电子邮件。 在邮件发送之前,我想预览一下pdf文件,这样用户就可以检查数据了。在

pdf是用PDFOrder函数从xml构造的。PDF存储在变量“PDF”中。所以,我的问题是如何在内存中生成pdf,并将其作为预览提供给用户?在

以下是发送电子邮件的示例代码:

def send_mail():
    Email1 = session.get('Email1')
    Email2 = session.get('Email2')
    invno = session.get('invno')
    username = session['username']
    invId = session['invId']
    xmlStr,xmlFile = XmlGenerator(invId)

try:
    msg = Message(Hi,
    sender="somemail@gmail.com",
    recipients=[Email1,Email2])

    msg.body = '\nHi'

    myxmlinv = xml.dom.minidom.parseString(xmlStr)
    xmlStr = myxmlinv.toprettyxml(encoding="utf-8")
    msg.attach("Test+".xml","application/xml",xmlStr)

    buff = BytesIO()


    pdfdoc = SimpleDocTemplate(buff, pagesize = letter)

    frame = Frame(pdfdoc.leftMargin,
            pdfdoc.bottomMargin,
            pdfdoc.width,
            pdfdoc.height,
            id = 'normal')

    template = PageTemplate(id = 'test', frames = frame)

    pdfdoc.addPageTemplates(template)

    pdforder = PDFOrder(xmlStr)
    Document = pdforder.createPDF()

    pdfdoc.build(Document)

    pdf = buff.getvalue()

    buff.close()

    msg.attach("Test_"+str(invId)+".pdf", "application/pdf", str(pdf))                  
    mail.send(msg)

except Exception, e:
    return(str(e))

下面的代码将用户带到/预览,它应该打开pdf。我更喜欢把pdf存储在内存中。我要如何用HTML呈现它?在

^{pr2}$

在 在

谢谢!在

更新 我设法保存了pdf文件。但不幸的是,它只包含了reportlab的一些测试,尽管它的扩展名是.pdf。所以,homehow不会以pdf格式呈现。有什么想法吗?奇怪的是电子邮件发送可以完美地与xml和pdf一起使用。你认为这部分很重要:"application/pdf", str(pdf)enter image description here 这是我最新的定义

@app.route('/preview/')
def preview():
invId = session['invId']
xmlStr,xmlFile = XmlGenerator(invId)

try:
    myxmlinv = xml.dom.minidom.parseString(xmlStr)
    xmlStr = myxmlinv.toprettyxml(encoding="utf-8")

pdfdoc = SimpleDocTemplate("/var/www/FlaskApp/FlaskApp/static/mypdf.pdf", pagesize = letter)
pdforder = PDFOrder(xmlStr)
Document = pdforder.createPDF()
pdfdoc.build(Document)

except Exception, e:
    return(str(e))

return render_template("test.html")

Tags: 用户pdfsessionmsgxmldocumentbuffstr
1条回答
网友
1楼 · 发布于 2024-04-20 09:49:19

据我所知,你实际上并没有命名你的PDF文件。这将在simpledoc声明中完成。下面是我所做的一个例子: doc = SimpleDocTemplate(filename, pagesize=letter)在这种情况下,filename变量是我想要pdf的完整路径。 示例:filename = r'C:\User\joe\Desktop\some_file.pdf'`

如果你想让文件进入你正在使用的同一个目录,你只需给它一个名字,而不需要完整的路径。即:filename = 'some_file.pdf'

一旦代码到达doc.build行,它将创建pdf。在

要打开它,请使用以下行之一:

对于Mac电脑:

os.system("open " + filename)

窗口:

os.system("start " + filename)

相关问题 更多 >