2017-07-01 70 views
0

烧瓶我发送附带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) 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") 
+0

我不知道,你可以只显示从内存完整的pdf。您可能必须先将它保存在某处,然后像平常一样打开它。 – Joe

+0

好吧,够公平的。另外,可以将它保存到某个目录,没有什么大不了的。 –

+0

是的,支持。我最近刚刚做到了这一点。让我抓住代码,并发布它作为答案 – Joe

回答

0

至于我可以告诉你实际上并没有命名您的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。

打开来使用这些行之一:

对于苹果机:

os.system("open " + filename)

的Windows:

os.system("start " + filename)

+0

也许我的问题描述有点弱。我实际上只是试图保存生成的PDF并使其可供用户预览PDF。如果这在内存中不可行,则可以将其保存在目录中。我没有设法将pdf保存到示例代码的目录中。 –

+0

是的示例代码更多用于选择目录。让我再看看,看看我能想出什么。我想我现在看到你想要的东西 – Joe

+0

pdfdoc = SimpleDocTemplate(buff,pagesize = letter)将文件命名为'buff'我认为。我可以要求您根据上述更新发布整个代码吗? –