Вывод 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.