django PDF FileResponse "Не удалось загрузить документ PDF." - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь сгенерировать и вывести PDF из вида django. Я следовал примеру в документации django, используя ReportLab , но загруженный PDF не открывается ни в одной программе чтения PDF.

Я использую Python 3.7.0, Django == 2.1.3, reportlab == 3.5.12. Я попытался добавить content_type="application/pdf" в 'FileResponse`, но все еще имел ту же проблему.

import io
from django.http import FileResponse
from reportlab.pdfgen import canvas

def printPDF(request):
    # Create a file-like buffer to receive PDF data.
    buffer = io.BytesIO()

    # Create the PDF object, using the buffer as its "file."
    p = canvas.Canvas(buffer)


    p.drawString(100, 100, "Hello world.")


    p.showPage()
    p.save()

    return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

Созданный PDF должен открываться во всех программах чтения PDF. Но я получаю сообщение «Не удалось загрузить документ PDF».

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

buffer = BytesIO() используется вместо файла для хранения PDF-документа. Прежде чем вернуть его с помощью FileResponse, вам нужно сбросить позицию потока в ее начало:

buffer.seek(io.SEEK_SET)

Теперь загрузка PDF должна работать как положено.

0 голосов
/ 13 января 2019

Кажется, что-то подозрительное происходит во взаимодействии BytesIO и FileResponse. Следующее сработало для меня.

def printPDF(request):
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=hello.pdf'
    p = canvas.Canvas(response)
    p.drawString(100, 100, "Hello world.")
    p.showPage()
    p.save()
    return response
...