Создание 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.

Copyright ©2020 All rights reserved