Возврат файла в виде загрузки в Django Python - PullRequest
0 голосов
/ 17 октября 2019

Я создал сайт с использованием Django и создал функцию, которая возвращает автоматически сгенерированный PDF из данных базы данных.

Для создания PDF я использую pyFPDF.

pdfreport = FPDF()
#Code for the PDF here

pdfreport.output(name='mypdf.pdf')

С этимкод все работает хорошо, PDF правильно сгенерирован. Но чтобы вернуть файл как HTTP-ответ, я сохраняю файл с dest='S' и создаю ответ.

pdf = pdfreport.output(dest='S')
response = = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="mypdf.pdf"'
return(response)

Используя это, ответ правильный, и я получил файл для сохранения,Браузер загружает файл в формате PDF, но PDF-файл пуст. И я не знаю, почему это произошло.

Я попытался сохранить файл, открыть файл с помощью open() и прикрепить его содержимое, но я все еще получил тот же результат, пустой PDF.

pdfreport.output(name=pdfname)
pdf = open(pdfname, 'r')
response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="mypdf.pdf"'
return(response)

Кто-нибудь, кто может мне помочь?

1 Ответ

0 голосов
/ 17 октября 2019

Сравнивая файл, который сохраняет FPDF и тот, который отправляется HTTP-ответом, я понимаю, что существует ошибка кодирования, поэтому я нашел это в официальной документации.

ВНИМАНИЕ: В Python 2строки были необработанными данными, но в Python 3 строки теперь по умолчанию являются юникодом. Если вы используете Python 3.x, вы должны использовать pdf.output(dest='S').encode('latin-1'), чтобы получить вывод, если вы этого не сделаете, сгенерированный PDF будет недействительным и, в зависимости от средства просмотра, либо не откроется вообще, либо отобразится как некоторыепустые страницы.

И я попробовал кодировать как latin-1, и наконец оно работает.

...