Найти - Пользователи
Полная версия: Изучаем ReportLab. Вводная часть...
Начало » Python для экспертов » Изучаем ReportLab. Вводная часть...
1 2 3
Teddy Bear
Изучаем 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). Эта библиотека идет с инсталлером и проблем с установкой возникнуть не должно.
На этом установку можно считать завершенной.
Teddy Bear
А теперь простейший пример работы. Создаем текстовый файл с расширением *.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. Мануал создавался нубом для нубов и потому содержит немало избыточных пояснений, а также может содержать неточности и даже ошибки. Просьба оставлять комментарии и предложения в ветке, а также если у вас возникнет желание продолжить этот благое дело, то не стесняться и графоманствовать сюда же ;)) Если администрация пожелает выложить это дело на сайте – я не против.
Teddy Bear
Да, и не пытайтесь просто так вставить русское “Привет Мир” в этот код - ничего не выйдет. Для этого нужно немного его доработать, а именно, добавить, скажем, шрифт 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()
Подробнее я разберу этот фрагмент в другой раз… ;)
bialix
может в pywiki.ru стоило графоманить? там вроде все условия для этого созданы.
конечно, можно и здесь – без проблем.
Teddy Bear
bialix
может в pywiki.ru стоило графоманить? там вроде все условия для этого созданы.
конечно, можно и здесь – без проблем.
Здесь может вычиткой кто займется или продолжить вдруг желание возникнет - форум все-таки поживее место будет.
bialix
с установкой что-то совсем все плохо. нарушаются все правила питона.
bialix
раз уж говорищь про переключение на сантиметры – то неплохо бы показать в коде.
pythonwin
Teddy Bear, идея хорошая и как черновик сойдет, но готовую статью лючше разместить на python.com.ua или pywiki.com
Teddy Bear
bialix
с установкой что-то совсем все плохо. нарушаются все правила питона.
В смысле? То, что папка reportlab помещается в корень Питона? Так в официальном мануале Репортлаба прописано. Предлагаешь кинуть её в C:\Python25\Lib\site-packages ?
bialix
раз уж говорищь про переключение на сантиметры – то неплохо бы показать в коде.
Разумеется. Это впереди, не успел еще.
pythonwin
идея хорошая и как черновик сойдет, но готовую статью лючше разместить на python.com.ua
Оно так и задумывалось. Допишу сопроводиловку по второму примеру, может еще чего добавлю и можно будет выкладывать.
pythonwin
Teddy Bear
Оно так и задумывалось. Допишу сопроводиловку по второму примеру, может еще чего добавлю и можно будет выкладывать.
насчет установки - разве ReportLab нельзя поставить припомощи setuptools (easy_install)?
+ хорошо бы описать установку и на другие ОС
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB