Формат PDF, разработанный компанией Adobe, используется для отображения печатных документов с полным попиксельным форматированием, встроенными шрифтами и двумерной векторной графикой. Вы можете рассматривать PDF документ в качестве электронного эквивалента напечатанного документа. В реальности, PDF документ довольно часто используется для передачи информации, которую затем требуется напечатать.
Вы можете легко создавать PDF документы с помощью Python и Django благодаря отличной открытой библиотеке ReportLab. Преимущество динамического создания PDF документов заключается в том, что вы можете изменять его различными способами, например, разная информация для разных пользователей.
Например, мы используем Django и ReportLab на сайте KUSports.com для генерации NCAA программ соревнований.
Однако перед тем как сгенерировать PDF документ вам потребуется установить ReportLab. Это несложно: просто скачайте и установите библиотеку с http://www.reportlab.org/downloads.html.
Руководство пользователя (доступное только в виде PDF) на http://www.reportlab.org/rsrc/userguide.pdf содержит дополнительные инструкции по установке.
Замечание
При использовании современного дистрибутива Linux, вы можете проверить наличие этой библиотеки в репозиториях операционной системы. Большинство репозиториев содержит данную библиотеку.
Например, если вы используете (обалденный) дистрибутив Ubuntu, установка библиотеки крайне проста:
apt-get install python-reportlab
Проверьте установку с помощью импортирования библиотеки в интерактивном интерпретаторе Python:
>>> import reportlab
Если эта команда не вызывает никаких ошибок, значит установка библиотеки прошла успешно.
Аналогично случаю с CSV, динамическое создание PDF объектов с помощью Django является несложным, по причине того, что API библиотеки ReportLab работает как файлоподобный объект.
Ниже представлен пример «Hello World»:
from reportlab.pdfgen import canvas
from django.http import HttpResponse
def hello_pdf(request):
# Создаём объект HttpResponse с соответствующим PDF заголовком.
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=hello.pdf'
# Создаём объект PDF, используя объект HttpResponse как файл.
p = canvas.Canvas(response)
# Выводим в PDF необходимую информацию. Вот так создаются PDF.
# Обратитесь к документации на ReportLab для подробностей.
p.drawString(100, 100, "Hello world.")
# Явно закрываем объект PDF.
p.showPage()
p.save()
return response
А теперь несколько замечаний:
В данном случае мы используем application/pdf в качестве MIME-типа. Это указывает браузеру, что документ является PDF файлом, а не HTML. Если вы забудете указать эту информацию, браузер проинтерпретирует документ как HTML файл и вывалит кучу мусора на экран.
Подключение к ReportLab API несложно: просто передайте response в качестве первого аргумента для
canvas.Canvas. ОбъектCanvasожидает файлоподобный объект и объектыHttpResponseсоответствуют этому требованию.Все вызовы дополнительных методов для создания PDF документа производятся от PDF объекта (см. p в коде), а не от response.
Наконец надо вызвать функции
showPage()иsave()для PDF файла, иначе вы получите испорченный PDF документ.
Если вы создаёте сложный PDF документ (или любой большой объём данных), рассмотрите возможность использования библиотеки cStringIO в качестве временного хранилища для вашего PDF файла. Библиотека cStringIO предоставляет файлоподобный интерфейс, который написан на языке C для достижения максимальной эффективности.
Перепишем предыдущий «Hello World» пример, используя библиотеку cStringIO:
from cStringIO import StringIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse
def hello_pdf(request):
# Создаём объект HttpResponse с соответствующим PDF заголовком.
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=hello.pdf'
temp = StringIO()
# Создаём объект PDF, используя объект StringIO как файл.
p = canvas.Canvas(temp)
# Выводим в PDF необходимую информацию. Здесь генерируется содержимое PDF.
# Обратитесь к документации на ReportLab для подробностей.
p.drawString(100, 100, "Hello world.")
# Явно закрываем объект PDF.
p.showPage()
p.save()
# Получаем данные из буфера StringIO и пишем отклик.
response.write(temp.getvalue())
return response
| Пред. | Уровень выше | След. |
| Генерация CSV | Начало | Другие возможности |
0 comments | Make a comment