#python #flask #pdf #pdf-generation #reportlab
Вопрос:
Я пытаюсь сгенерировать pdf-файл в памяти и просмотреть его для загрузки без создания pdf-файла на диске. Перепробовал множество решений. У меня все работало нормально, прежде чем отправлять файлы на диск, но я не смог вывести его на экран без предварительного наличия физического файла. Вот где я нахожусь:
def demo_report(demos, title, criteria):
# sort and subtotal demos by org / mgr / sales Rep / Demo Rep / Date (newest to oldest)
buffer = io.BytesIO()
c = canvas.Canvas(buffer, pagesize=landscape(letter))
width, height = landscape(letter)
l1 = 15
l2 = 30
l3 = 35
y = height - l1
c.drawString(50,y,title)
y -= l1
c.drawString(50,y, criteria)
y -= l2
demo_report_heading(c,y)
y -= l1
org = 0
org_demos = 0
org_total = 0.0
for demo in demos:
if demo.org_id != org:
if org_demos > 0:
# print org totals
demo_report_subtotal(c, y, 'Subtotal for Org #' str(org), org_demos, org_total)
y -= l2
# print org header
org = demo.org_id
org_demos = 0
org_total = 0.0
demo_report_subheader(c, y, 'Org #' str(org))
y -= l2
c.drawString(50,y,str(demo.id))
c.drawString(100,y,demo.location.name)
c.drawString(300,y,demo.user.name)
c.drawString(400,y,'Sch: ' str(demo.sch_start) '*')
c.drawString(550,y,str(demo.sch_hours))
c.drawString(600,y,demo.status.name)
c.drawString(700,y,str(demo.rate))
c.drawString(400,y-l3,'Act: ' str(demo.act_start) '*')
c.drawString(550,y-l3,str(demo.act_hours))
y -= l2
org_demos = 1
org_total = demo.rate
if org_demos > 0: demo_report_subtotal(c, y, 'Subtotal for Org #' str(org), org_demos, org_total)
c.showPage()
c.save()
buffer.seek(0)
settings.configure()
dc = settings.DEFAULT_CHARSET
d = datetime.datetime.now()
filename = 'DemoReport_' current_user.username d.strftime('%Y-%m-%d_%H-%M-%S') '.pdf'
pdf_value = buffer.getvalue()
buffer.close()
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="' filename '"'
response.write(pdf_value)
return response