Генерация ответа в формате PDF 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 е., ил.
Похожие посты:
- Создание блока с закругленными краями (0)
- Добавление тени к блоку (0)
- Вывод текста с отступом (0)
- Применение эффекта прозрачности (0)
- Создание навигационного меню с подпунктами с помощью списков и таблиц стилей (0)
- Создание доступного навигационного меню на основе изображений с помощью CSS (0)
- Достижение прозрачности изображения в формате PNG в Internet Explorer 6 (1)