Flask: создание предварительного просмотра PDF с отчетом

С помощью Flask я отправляю электронные письма с прикрепленными XML и PDF. Перед отправкой письма я хотел бы иметь предварительный просмотр PDF, чтобы пользователь мог проверить данные.

PDF создается из XML с помощью функции PDFOrder. 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. Но, к сожалению, он содержит только несколько тестов 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")

1 ответ

Насколько я могу судить, вы на самом деле не называете свой 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)

Другие вопросы по тегам