Django : Загрузка PDF, сгенерированного библиотекой FPDF

У меня есть представление, которое содержит форму мастера. Когда форма отправляется, посылается httpresponse с PDF-файлом. Я генерирую PDF файл с помощью библиотеки FPDF2 из данных, полученных в форме, отправленной пользователем.

Чтобы убедиться, что класс PDF, использующий эту библиотеку, работает, я протестировал его в простом скрипте python.

Моя проблема связана с pdf, который я скачиваю, я не могу его открыть. У меня ошибка "Мы не можем открыть этот файл. Что-то пошло не так". Поэтому я думаю, что проблема в том, как я отправляю данные pdf в Httpreponse.

Вот мой код :

class FormWizardQR(SessionWizardView):
    template_name = "invoices/qr.html"
    form_list = [FormStepOneBeneficiary, FormStepTwoPaymentInfos, FormStepThreeDebtor]

    def done(self, form_list, **kwargs):

        # GET DATA FROM FORMS
        form_data = dict(ChainMap(*[form.cleaned_data for form in form_list]))
        
        # PREPARE DATA FOR QR-PDF GENERATOR
        list_str_pay_to = [form_data.get('iban_beneficiary'), form_data.get('name_beneficiary'), f"{form_data.get('street_beneficiary')} {form_data.get('street_number_beneficiary')}", f"{form_data.get('npa_beneficiary')} {form_data.get('locality_beneficiary')}", form_data.get('country_beneficiary')]
        list_str_pay_by = [form_data.get('name_debtor'), f"{form_data.get('street_debtor')} {form_data.get('street_number_debtor')}", f"{form_data.get('npa_debtor')} {form_data.get('locality_debtor')}", form_data.get('country_debtor')]
        reference = form_data.get('ref_number')

        # GENERATE QR-IMAGE
        qr = SWISS_QR(data="https://www.20min.ch/fr")
        image_qr = qr.generate_qr()

        
        pdf = PDF('portrait', 'mm', 'A4')
        pdf.set_margins(left=0, top=0, right=0)
        pdf.add_page()
        pdf.border_bill()
        pdf.r_title("Récépissé")
        pdf.r_zone_indications(reference=reference, list_str_pay_to=list_str_pay_to, list_str_pay_by=list_str_pay_by)
       
        pdf.output(name="myfilename.pdf", dest="S")
        print(type(pdf))
        print(pdf)

        response = HttpResponse(pdf, content_type='application/pdf')
        response['Content-Disposition'] = "attachment; filename=myfilename.pdf"
        return response



 

Согласно документации последней версии pyFPDF2 (версия 2.5.7): https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.output

Dest является DEPRECATED и "По умолчанию возвращается буфер байтового массива. Если задано имя, PDF записывается в новый файл."

Так что это просто необходимо :

response = HttpResponse(bytes(pdf.output()), content_type='application/pdf')
response['Content-Disposition'] = "attachment; filename=myfilename.pdf"
        return response
Вернуться на верх