Форум сайта python.su
Изучаем ReportLab. Вводная часть.
ReportLab – это open source (BSD license) библиотека, позволяющая создавать PDF-документы любой сложности напрямую из Python’a. Кроме того, она умеет отрисовывать всевозможные графики и диаграммы как в различные растровые и векторные форматы файлов так и в PDF. Документ создается набором высокоуровневых команд, что делает ReportLab чрезвычайно привлекательным инструментом для динамической генерации отчетов баз данных. Показательно, что NASA интенсивно использует ReportLab в своей повседневной работе.
ReportLab кроссплатформенный пакет, написан большей частью на Python’е и немного на С. Работает довольно шустро – должен вполне адекватно функционировать на слабых компьютерах. Утверждается, что работает и на win9x платформах - сам еще не успел проверить, но знаю, что для многих разработчиков отчетов к БД это важный момент.
ReportLab позволяет оперировать как простейшими командами типа “разместить на листе рисунок/линию/текст с координатами x,y” так обладает и более продвинутыми инструментами для разметки параграфов, колонтитулов, конструирования и автозаполнения таблиц, расстановки номеров страниц.
(прим.: Я сперва усомнился в целесообразности использования PDF для отчетов - на нашем предприятии немало старых машин p200/32Mb RAM и запускать на них AcrobatReader_8 было бы просто издевательством. Но отыскав версию AcrobatReader_5.05 был приятно удивлен – запускается мгновенно (даже на старом железе), рендерит быстро, жрет памяти – от 4 до 8 Mb в зависимости от размера документа. Позволяет отправлять документ на принтер из командной строки (напр.: AcroRd32.exe /t “c:\temp\hello.pdf” HP_6L.
Ещё я обнаружил отличный просмотрщик pdf файлов Foxit Reader 2.0 - маленький, быстрый и, самое главное, очень удобен при отладке скриптов reportlab'а - попробуйте, поймете сами о чем я говорю ;)).
Установка.
Сборки ReportLab для Linux есть в репозитариях большинства дистрибутивов, так что достаточно скачать пакет и установить его. Что же касается пользователей Windows, то тут чуть сложнее. К сожалению, авторы библиотеки поленились сделать win-инсталлер, поэтому будем все делать руками:
1. Устанавливаем дистрибутив Python не ниже v.2.4
2. Скачиваем дистрибутив ReportLab не ниже v.2.0
3. Скачиваем ReportLab Windows Precompiled DLLs (2.4 или 2.5 в зависимости от того какая версия Питона у вас установлена) (лежат на той же web странице что и дистрибутив ReportLab’а)
4. Разархивируем ReportLab в папку где установлен Python, должно получиться примерно следующее: в каталоге C:\Python25\reportlab\ у вас будут лежать папки и файлы с именами demos, pdfgen, platypus, rl_config.py и т.д. ( напр. C:\Python25\reportlab\rl_config.py )
5. В папке с установленным Питоном (в моем случае C:\Python25\) заходим в папку Lib, а оттуда в папку site-packages. Сюда разворачиваем файлы из архива скачанного в пункте 3 (штук шесть с расширением .pyd). Должно получиться напр. C:\Python25\Lib\site-packages\_rl_accel.pyd.
6. Если вы планируете работать с графическими файлами, то вам следует также скачать и установить Python Imaging Library (PIL). Эта библиотека идет с инсталлером и проблем с установкой возникнуть не должно.
На этом установку можно считать завершенной.
Отредактировано (Авг. 21, 2007 13:07:11)
Офлайн
А теперь простейший пример работы. Создаем текстовый файл с расширением *.py (пример №1):
from reportlab.pdfgen import canvas
MyCanvas = canvas.Canvas(“hello.pdf”)
MyCanvas .drawString(270,410,“Hello World”)
MyCanvas .save()
Запускаем этот файл и в этом же каталоге появляется сгенерированный файл hello.pdf с надписью в центре листа «Hello World».
Подробно разбираем по строкам код:
Импортируем модуль canvas из пакета reportlab.pdfgen. Модули этого пакета обеспечивают самые низкоуровневые операции по созданию PDF. Модуль (и содержащийся в нем класс) canvas предоставляет возможность последовательно «рисовать/печатать» на «холсте» создаваемого PDF-файла.:
from reportlab.pdfgen import canvas
Инициализируем объект MyCanvas (экземпляр класса Canvas) и указываем ему имя и расположение создаваемого PDF файла (в данном случае он будет создан в текущем каталоге):
MyCanvas = canvas.Canvas(“hello.pdf”)
Печатаем на «холсте» сакраментальную фразу “Hello World” с координатами 270 (по оси X), 410 (по оси Y). Поясню: у нас в распоряжении имеется классическая Декартова система координат с точкой 0,0 в нижнем левом углу стандартного листа A4 размером 595.27 на 841.89 типографских пункта (1 типографский пункт равен 1/72 дюйма). При желании можно переключиться на более понятную для обычного человека систему счисления, напр. сантиметры (но об этом чуть позже).
MyCanvas .drawString(270,410,“Hello World”)
И наконец, сохраняем наш PDF файл и закрываем инициализированный ранее MyCanvas
MyCanvas .save()
Продолжение следует…
P.S. Мануал создавался нубом для нубов и потому содержит немало избыточных пояснений, а также может содержать неточности и даже ошибки. Просьба оставлять комментарии и предложения в ветке, а также если у вас возникнет желание продолжить этот благое дело, то не стесняться и графоманствовать сюда же ;)) Если администрация пожелает выложить это дело на сайте – я не против.
Отредактировано (Авг. 22, 2007 08:55:39)
Офлайн
Да, и не пытайтесь просто так вставить русское “Привет Мир” в этот код - ничего не выйдет. Для этого нужно немного его доработать, а именно, добавить, скажем, шрифт Arial вместо идущего по умолчанию (у которого нет начертаний русских символов) и указать Питону использовать кодировку utf-8, ну и сам текстовый файл, разумеется должен быть сохранен в кодировке utf-8. Звучит страшно, но на деле это всего лишь (пример №2):
# -*- coding: utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase import ttfonts
MyFontObject = ttfonts.TTFont('Arial', ‘arial.ttf’)
pdfmetrics.registerFont(MyFontObject)
MyCanvas = canvas.Canvas(“hello.pdf”)
MyCanvas .setFont(“Arial”, 40)
MyCanvas .drawString(200,400,“Привет Мир”)
MyCanvas .save()
Подробнее я разберу этот фрагмент в другой раз… ;)
Отредактировано (Авг. 21, 2007 13:11:07)
Офлайн
может в pywiki.ru стоило графоманить? там вроде все условия для этого созданы.
конечно, можно и здесь – без проблем.
Офлайн
bialixЗдесь может вычиткой кто займется или продолжить вдруг желание возникнет - форум все-таки поживее место будет.
может в pywiki.ru стоило графоманить? там вроде все условия для этого созданы.
конечно, можно и здесь – без проблем.
Офлайн
с установкой что-то совсем все плохо. нарушаются все правила питона.
Офлайн
раз уж говорищь про переключение на сантиметры – то неплохо бы показать в коде.
Офлайн
Teddy Bear, идея хорошая и как черновик сойдет, но готовую статью лючше разместить на python.com.ua или pywiki.com
Офлайн
bialixВ смысле? То, что папка reportlab помещается в корень Питона? Так в официальном мануале Репортлаба прописано. Предлагаешь кинуть её в C:\Python25\Lib\site-packages ?
с установкой что-то совсем все плохо. нарушаются все правила питона.
bialixРазумеется. Это впереди, не успел еще.
раз уж говорищь про переключение на сантиметры – то неплохо бы показать в коде.
pythonwinОно так и задумывалось. Допишу сопроводиловку по второму примеру, может еще чего добавлю и можно будет выкладывать.
идея хорошая и как черновик сойдет, но готовую статью лючше разместить на python.com.ua
Отредактировано (Авг. 10, 2007 10:19:46)
Офлайн
Teddy Bearнасчет установки - разве ReportLab нельзя поставить припомощи setuptools (easy_install)?
Оно так и задумывалось. Допишу сопроводиловку по второму примеру, может еще чего добавлю и можно будет выкладывать.
Офлайн