烧瓶我发送附带xml和pdf的电子邮件。 发送邮件之前,我想预览一下pdf,以便用户检查数据。烧瓶:使用reportlab生成预览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="[email protected]",
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中呈现它?
<a href="/preview" target="_blank"><center><button type=button class="btn btn-default btn-lg">
谢谢!
UPDATE 我设法保存了pdf。但不幸的是,它只是对reportlab进行了一些测试,尽管它有.pdf扩展名。所以,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。您可能必须先将它保存在某处,然后像平常一样打开它。 – Joe
好吧,够公平的。另外,可以将它保存到某个目录,没有什么大不了的。 –
是的,支持。我最近刚刚做到了这一点。让我抓住代码,并发布它作为答案 – Joe