Генерация ответа в формате PDF Django

Опубликовал: Thursday, February 9, 2024 в категории Django | Пока нет комментариев

Формат Portable Document Format (PDF - формат переносимых документов) разработан компанией Adobe для представления документов, предназначенных для печати. Он поддерживает размещение с точностью до пиксела, вложенные шрифты и двумерную векторную графику. Документ в формате PDF можно считать цифровым эквивалентом печатного документа; действительно, документы, предназначенные для печати, очень часто распространяются в этом формате.

Python и Django позволяют без труда создавать PDF-документы благодаря великолепной библиотеке ReportLab (http://www.reportlab.org/rl_ toolkit.html). Достоинство динамического создания PDF в том, что можно создавать специализированные документы для разных целей, например, свой для каждого пользователя или с разным содержимым.

Например, авторы применяли Django и ReportLab на сайте KUsports. com для создания документов, содержащих турнирные сетки соревнований по баскетболу, проводимых Национальной студенческой спортивной ассоциацией.

Установка ReportLab

Прежде чем приступать к созданию PDF, необходимо установить библиотеку ReportLab. Ничего сложного в этом нет, просто загрузите ее со страницы http://www.reportlab.org/downloads.html и установите на свой компьютер.

Примечание ——————————————————————————

Если вы пользуетесь современным дистрибутивом Linux, сначала проверьте, нет ли в нем уже готового пакета. Пакет ReportLab уже включен в состав большинства репозиториев. Например, в случае Ubuntu достаточно выполнить команду apt-get install python-reportlab.

В руководстве пользователя (естественно, в формате PDF) по адресу http://www.reportlab.org/rsrc/userguide.pdf имеются дополнительные инструкции по установке.

Проверьте правильность установки, импортировав библиотеку в интерактивном интерпретаторе Python:

>» import reportlab

Если команда выполнится без ошибок, значит, установка прошла нормально.

Создание собственного представления

Как и в случае с форматом CSV, динамическое создание PDF в Django не вызывает сложностей, так как для работы с объектами библиотека ReportLab использует API доступа к файлам:

Ниже приводится простенький пример «Hello World»:

from reportlab.pdfgen import canvas from django.http import HttpResponse

def hello_pdf(request):

tt Создать объект HttpResponse с заголовками для формата PDF.

response = HttpResponseCmimetype^’application/pdf’)

response[‘Content-Disposition’] = ‘attachment; filename=hello.pdf1

tt Создать объект PDF, передав объект ответа в качестве "файла", р = canvas.Canvas(response)

tt Нарисовать нечто в PDF. Именно здесь происходит создание tt содержимого PDF-документа.

tt Полное описание функциональности см. в документации ReportLab. p.drawString(100, 100, "Hello world.")

tt Закрыть объект PDF, все готово, p.showPage() p.save() return response

Здесь будет уместно сделать несколько замечаний:

•    Мы указали тип MIME application/pdf и тем самым сообщили броузеру, что это документ в формате PDF, а не HTML. Если опустить эту информацию, то броузер попытается интерпретировать ответ как страницу HTML и выведет на экран белиберду.

•    Обратиться к ReportLab API очень просто, достаточно передать response в качестве первого аргумента конструктору canvas.Canvas, который ожидает получить «файлоподобный» объект.

•    Дальнейшее создание содержимого документа осуществляется путем вызова методов объекта PDF (в данном случае р), а не response.

•    Наконец, важно не забыть вызвать для объекта PDF методы show- PageQ и saveQ, иначе получится испорченный PDF-файл.

Создание сложных PDF-документов

При создании сложного PDF-документа (как и любого большого двоичного объекта) имеет смысл воспользоваться библиотекой cStringlO для временного хранения создаваемого файла. Она предоставляет интерфейс «файлоподобного» объекта, написанный на языке С для достижения максимальной эффективности.

Ниже приводится тот же самый пример «Hello World», переписанный с использованием cStringlO:

from cStringlO import StringlO from reportlab.pdfgen import canvas from django.http import HttpResponse

def hello_pdf(request):

tt Создать объект HttpResponse с заголовками для формата PDF.

response = HttpResponse(mimetype=’application/pdf’)

response[‘Content-Disposition’] = ‘attachment; filename=hello.pdf’

temp = StringlOO

tt Создать объект PDF, используя объект StringlO в качестве tt "файла".

р = canvas.Canvas(temp)

tt Рисовать в PDF. Именно здесь происходит создание tt содержимого PDF-документа.

tt Полное описание функциональности см. в документации ReportLab. p.drawString(100, 100, "Hello world.")

tt Закрыть объект PDF. p.showPage() p.save()

tt Получить значение из буфера StringlO и записать его в ответ, response.write(temp.getvalue()) return response

Прочие возможности

Языком Python поддерживается возможность создания содержимого во множестве других форматов. Ниже перечислены ссылки на некоторые библиотеки, позволяющие это делать.

•    ZIP-файлы. В стандартную библиотеку Python входит модуль zipf ile, который позволяет читать и записывать сжатые файлы в формате ZIP. С его помощью можно по запросу создавать архивы, включающие несколько файлов, или сжимать объемные документы. А модуль tarf ile из стандартной библиотеки позволяет создавать архивы в формате TAR.

•    Динамические изображения. Библиотека Python Imaging Library (PIL; http://www.pythonware.com/products/pil/) включает фантастический набор инструментов для создания изображений в форматах PNG, JPEG, GIF и многих других. С ее помощью можно автоматически создавать миниатюры изображений, объединять несколько изображений в одно и даже реализовывать интерактивную обработку картинок на сайте.

•    Графики и диаграммы. Существует целый ряд мощных библиотек на языке Python, предназначенных для рисования графиков и диаграмм. С их помощью можно производить визуализацию данных по запросу. Перечислить все нет никакой возможности, но две ссылки мы все же дадим:

•    matplotlib (http://matplotlib.sourceforge.net/) позволяет создавать высококачественные графики, аналогичные тем, что создаются в программах MatLab или Mathematica.

•    pygraphviz (http://networkx.lanl.gov/pygraphviz/) - интерфейс к пакету Graphviz для рисования графиков (http://graphviz.org/). Можно использовать для создания структурированных рисунков, содержащих графики и схемы.

Вообще говоря, к Django можно подключить любую библиотеку на языке Python, умеющую писать в файл. Возможности поистине безграничны.

Теперь, познакомившись с основами создания содержимого в формате, отличном от HTML, перейдем на следующий уровень абстракции. В дистрибутив Django входит ряд удобных инструментов для создания файлов в нескольких распространенных форматах.

Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *