使用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中呈现它?
<a href="/preview" target="_blank"><center><button type=button class="btn btn-default btn-lg">
谢谢!
更新
我设法保存了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")
答案 0 :(得分:0)
据我所知,你实际上并没有命名你的PDF文件。这将在simpledoc
声明中完成。这是我做过的一个例子:
doc = SimpleDocTemplate(filename, pagesize=letter)
在这种情况下,filename
变量是我想要pdf的完整路径。
例如:filename = r'C:\User\joe\Desktop\some_file.pdf
&#39;`
如果您希望文件进入您正在使用的同一目录,您可以在没有完整路径的情况下为其命名。即:filename = 'some_file.pdf'
一旦您的代码点击doc.build
行,它就会创建pdf。
要打开它,请使用以下其中一行:
对于MAC:
os.system("open " + filename)
Windows:
os.system("start " + filename)