Вывод PDF-файлов с помощью Django

В этом документе объясняется, как динамически выводить файлы PDF с помощью представлений Django. Это стало возможным благодаря превосходной библиотеке ReportLab Python PDF с открытым исходным кодом .

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

Например, Django использовался на kusports.com для создания настраиваемых, удобных для печати турнирных таблиц NCAA в виде файлов PDF для людей, участвующих в конкурсе March Madness.

Установить ReportLab

Библиотека ReportLab доступна в PyPI . Руководство пользователя (не случайно, PDF - файл) также доступно для загрузки. Вы можете установить ReportLab с помощью pip:

$ python -m pip install reportlab
... \> py -m pip install reportlab

Проверьте свою установку, импортировав ее в интерактивный интерпретатор Python:

>>> import reportlab

Если эта команда не вызывает ошибок, установка прошла успешно.

Напишите свое мнение

Ключ к динамическому созданию PDF-файлов с помощью Django заключается в том, что API ReportLab действует с файловыми объектами, а FileResponse объекты Django принимают файловые объекты.

Вот пример «Hello World»:

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

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.
    buffer.seek(0)
    return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

Код и комментарии не требуют пояснений, но некоторые вещи заслуживают упоминания:

  • Ответ автоматически установит тип MIME application / pdf на основе расширения имени файла. Это сообщает браузерам, что документ является файлом PDF, а не файлом HTML или общим двоичным содержимым приложения / потока октетов .
  • Когда as_attachment=Trueпередается в FileResponse, он устанавливает соответствующий Content-Dispositionзаголовок и сообщает веб-браузерам о необходимости вывести диалоговое окно с запросом / подтверждением того, как обрабатывать документ, даже если на компьютере установлено значение по умолчанию. Если as_attachmentпараметр не указан, браузеры будут обрабатывать PDF-файл с помощью любой программы / плагина, которые они настроили для использования с PDF-файлами.
  • Вы можете указать произвольный filenameпараметр. Он будет использоваться браузерами в диалоговом окне «Сохранить как…».
  • Вы можете подключиться к ReportLab API: тот же буфер, переданный в качестве первого аргумента, canvas.Canvasможет быть передан FileResponseклассу.
  • Обратите внимание, что все последующие методы создания PDF вызываются для объекта PDF (в данном случае p), а не для buffer.
  • Наконец, важно позвонить showPage()и save()по файлу PDF.

Примечание

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

Другие форматы

Обратите внимание, что в этих примерах не так много специфичных для PDF-файлов - используются только биты reportlab. Вы можете использовать аналогичную технику для создания любого произвольного формата, для которого вы можете найти библиотеку Python. Также см. Раздел «Вывод CSV с помощью Django», где приведен еще один пример и некоторые методы, которые можно использовать при создании текстовых форматов.

Смотрите также

Django Packages предоставляет сравнение пакетов, которые помогают создавать файлы PDF из Django.

Copyright ©2021 All rights reserved