Хостинг Django от «Джино»
Table of contents

Генерация 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


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

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

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5