[英]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.