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)