Spec-Zone.ru › Django 6.0

Как создавать 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API