Создание PDF-файлов с помощью Django ¶
В этом документе объясняется, как динамически создавать файлы PDF с помощью представлений Django. Это возможно благодаря отличной бесплатной библиотеке Python ReportLab .
Преимущество динамического создания PDF-файлов заключается в том, что вы можете создавать собственные PDF-файлы для различных нужд, например, на основе пользователей или определенных частей контента.
Например, Django использовался на сайте kusports.com для создания готовых к печати турнирных таблиц NCAA в виде файлов PDF для участников конкурса «Мартовское безумие».
Установка 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 или другим общим двоичным содержимым, таким как application / octet-stream .
- Когда
as_attachment=True
передается вFileResponse
, заголовокContent-Disposition
устанавливается соответствующим образом и заставляет веб-браузеры открывать диалоговое окно, спрашивающее, как обрабатывать документ, даже если на машине установлено поведение по умолчанию. Если параметрas_attachment
не указан, браузеры управляют файлом PDF напрямую с помощью программы или плагина, которые будут настроены для файлов PDF. - Вы можете указать параметр
filename
по вашему выбору. Этот контент будет использоваться в диалоговых окнах .Enregistrer sous…
- Возможно подключение к ReportLab API: тот же буфер, переданный в качестве первого параметра,
canvas.Canvas
может быть передан классуFileResponse
. - Обратите внимание, что любой последующий метод создания PDF вызывается для объекта PDF (
p
в данном случае), а не дляbuffer
. - Наконец, важно позвонить
showPage()
иsave()
по файлу PDF.
Заметка
ReportLab не является «потокобезопасным». Некоторые пользователи сообщали о странных проблемах при создании Django PDF-представлений, которые одновременно вызываются многими людьми.
Другие форматы ¶
Вы обнаружите, что эти примеры не содержат большого количества конкретного кода в формате PDF, а только те части, которые используют reportlab
. Таким образом, вы можете использовать аналогичные методы для создания любого другого формата, для которого вы найдете библиотеку Python. Также см. Создание CSV с помощью Django , еще один пример, содержащий некоторые методы, которые вы можете использовать при создании текстовых форматов.
Смотрите также
На сайте Django Packages есть сравнение пакетов, которые могут помочь создавать файлы PDF с помощью Django.