Как создавать PDF-файлы
В этом документе объясняется, как динамически формировать PDF-файлы с помощью представлений Django. Это возможно благодаря отличной библиотеке Python для работы с PDF-файлами с открытым исходным кодом ReportLab.
Преимущество динамического создания PDF-файлов заключается в том, что можно создавать PDF-файлы с индивидуальным содержимым для разных целей — например, для разных пользователей или разных материалов.
Например, на kusports.com Django использовали для создания персонализированных турнирных сеток 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 принимают объекты, подобные файлам.
Вот пример «Привет, мир»:
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. Браузеры будут использовать его в диалоговом окне «Сохранить как…». - Можно использовать API ReportLab: тот же буфер, который передается первым аргументом в
canvas.Canvas, можно передать классуFileResponse. - Обратите внимание, что все последующие методы создания PDF вызываются для объекта PDF (в данном случае —
p), а не дляbuffer. - Наконец, важно вызвать
showPage()иsave()для PDF-файла.
Примечание
ReportLab не является потокобезопасной библиотекой. Некоторые пользователи сообщали о необычных проблемах при создании представлений Django для генерации PDF-файлов, к которым одновременно обращается много людей.
Другие форматы
Обратите внимание: в этих примерах почти нет ничего специфичного для PDF — только части, использующие reportlab. Аналогичный подход можно применить для создания любых форматов, для которых существует библиотека Python. Другой пример и некоторые приемы создания текстовых форматов см. в разделе Как создавать вывод в формате CSV.
См. также
Django Packages предлагает сравнение пакетов, которые помогают создавать PDF-файлы в Django.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/howto/outputting-pdf/