Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Оглавление

Генерация PDF

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

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

Например, мы используем Django и ReportLab на сайте KUSports.com для генерации NCAA программ соревнований.

Установка ReportLab

Однако перед тем как сгенерировать 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 документы

Если вы создаёте сложный 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


Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
1049 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID