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