PDF-файл, созданный с использованием reportlab, сохраненный в виде простого текста - PullRequest
0 голосов
/ 11 декабря 2018

это первый раз, когда я использую reportlab.Я скопировал точный код из документации Django.https://docs.djangoproject.com/en/2.1/howto/outputting-pdf/. Когда я сохраняю файл, он сохраняется в виде обычного текстового документа (text / plain), имя остается тем же hello.pdf, и текст отсутствует.

p = canvas.Canvas (буфер) в этой строке, если я пишу имя файла 'hello.pdf' вместо буфера и удаляю буфер из метода fileresponse, он работает и автоматически сохраняется как файл pdf, но я не могу предложить пользователю сохранить файл и тамдве страницы в pdf.

def some_view(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)

    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()

    # FileResponse sets the Content-Disposition header so that browsers
    # present the option to save the file.
    return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

я попытался указать content_type = 'application / pdf' в коде, предоставленном документацией django, но он все еще сохраняется как простой текстовый документ.я предполагаю, что ответ File не может угадать тип файла из аргумента имени файла, как упомянуто в документации django.

class FileResponse (open_file, as_attachment = False, filename = '', ** kwargs), если open_file не делаетУ вас нет имени или, если имя open_file не подходит, укажите пользовательское имя файла с помощью параметра имени файла.

Добавлены аргумент as_attachment и filename ключевые слова.Кроме того, FileResponse устанавливает Contentheaders, если он может их угадать.

Если я использую код из документации 2.0 django, это работает.Есть ли ошибка в последней документации 2.1 Django?я установил все зависимости по официальной ссылке https://bitbucket.org/rptlab/reportlab/src/927995d54048767531a4ad4a0648e46064b0c4c7/README.txt?at=default&fileviewer=file-view-default environment- ubuntu 18.04lts, pycharm, Python 3.5.6, reportlab 3.5.12.

1 Ответ

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

Вам необходимо сбросить позицию буфера, чтобы начать перед возвратом FileResponse:

buffer.seek(io.SEEK_SET)

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

Это отсутствует в документации начиная с версии 2.1 и должно быть исправлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...