繁体   English   中英

Flask:使用reportlab生成预览PDF

[英]Flask: Generate preview PDF with reportlab

与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))

下面的代码将用户带到/ preview,这将打开pdf。 我希望将pdf存储在内存中。 我将如何用HTML呈现它?

<a href="/preview" target="_blank"><center><button type=button class="btn btn-default btn-lg">

谢谢!

更新我已经成功保存了pdf。 但是不幸的是,尽管它具有.pdf扩展名,但它仅对reportlab进行了一些测试。 因此,homehow不会渲染为pdf。 任何想法? 奇怪的是,电子邮件发送可以同时与xml和pdf完美配合。 您认为这部分很重要: "application/pdf", str(pdf) 在此处输入图片说明 那是我更新的定义

@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")

据我所知,您实际上并不是在命名您的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM