Предварительный просмотр PDF-файла ReportLab в приложении Flask без сохранения файла

#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