Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 10, 2007 11:17:09

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

pythonwin
+ хорошо бы описать установку и на другие ОС
ReportLab есть в репозитариях большинства дистрибутивов Linux, так что достаточно скачать пакет и установить его.
Для установки, например, в Fedora можно воспользоваться юмом:
yum install python-reportlab



Офлайн

#2 Авг. 10, 2007 11:30:56

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

тогда почему в винде так страшно ставиться?



Офлайн

#3 Авг. 10, 2007 12:55:04

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

pythonwin
тогда почему в винде так страшно ставиться?
Бо винда страшная ;)



Офлайн

#4 Авг. 10, 2007 13:11:06

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

balu
Бо винда страшная ;)
не думаю что в этом случае винда виновата:
- скачал ReportLab_2_1.tgz
- разархивировал
- выполнил “python setup.py bdist_wininst”
- зашел в папку ./dist
- запустил Reportlab-2.1.win32.exe
:)
Teddy Bear
Разархивируем ReportLab в папку где установлен Python, должно получиться примерно следующее: в каталоге C:\Python25\reportlab\ у вас будут
лежать папки и файлы с именами demos, pdfgen, platypus, rl_config.py и т.д. ( напр. C:\Python25\reportlab\rl_config.py )
и не нужно ничего разархивировать :)



Отредактировано (Авг. 10, 2007 13:11:34)

Офлайн

#5 Авг. 15, 2007 13:45:10

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

Итак, подробно разбираем второй пример:
# -*- coding: utf-8 -*-
В начале первой строки этого скрипта стоит «решетка» - признак комментария, текста, который в обычном случае был бы пропущен Питоном «мимо ушей». Но в данной ситуации «# -*- coding: utf-8 -*- » это директива, указывающая Питону, что весь листинг программы идущий далее следует воспринимать в кодировке utf-8 и, соответственно, все создаваемые строковые переменные тоже будут в этой кодировке (если явным образом не указано иное). Эта директива должна обязательно идти первой или второй строкой в программе, иначе интерпретатор сочтет её за обычный комментарий и проигнорирует. Кроме того, удостоверьтесь, что текст программы действительно набран и сохранен в кодировке utf-8, любой современный редактор позволяет это сделать.
Технические подробности: на самом деле, можно вообще обойтись без директивы «# -*- coding: utf-8 -*- », достаточно сохранить ваш файл в редакторе как “utf-8 с BOM-заголовком”. Тогда директива «# -*- coding: utf-8 -*- » окажется избыточной – Питону вполне достаточно будет этого самого BOM-заголовка чтобы определиться с кодировкой.
В дальнейшем, чтобы избежать неразберихи с кодировками рекомендую вам работать в utf-8, поскольку ReportLab 2.x понимает только эту кодировку (либо строковые объекты юникод). Но с другой стороны, если вам вдруг понадобится из этой же программы обратиться к файлу или папке с русским именем, то придется воспользоваться функциями перекодировки в cp1251 (в русской WindowsXP имена файлов кодируются в ней), что не очень удобно.


Импортируем модуль canvas (разбирали в примере 1):
from reportlab.pdfgen import canvas

Импортируем модуль pdfmetrics (из пакета reportlab.pdfbase), что позволит нам регистрировать и использовать дополнительные шрифты в текущем PDF-файле:
from reportlab.pdfbase import pdfmetrics

Импортируем модуль ttfonts (из того же пакета reportlab.pdfbase) - это позволит нам создавать объекты-шрифты на основе файлов TrueType шрифтов (*.ttf):
from reportlab.pdfbase import ttfonts


Инициализируем объект-шрифт MyFontObject (экземпляр класса TTFont). На входе передаем ему имя, по которому мы будем обращаться к этому шрифту в дальнейшем ('Arial') и указываем наименование и местоположение файла TrueType шрифта ('arial.ttf') на основе которого мы создаем объект . В Windows можно не прописывать весь путь к ttf-файлу, достаточно указать непосредственно имя файла (но только в том случае, если этот файл находится в системной папке со шрифтами):
MyFontObject = ttfonts.TTFont('Arial', ‘arial.ttf’)

Регистрируем созданный выше объект-шрифт MyFontObject, чтобы появилась возможность использовать его в текущем pdf-файле. Для этого передаем MyFontObject в качестве аргумента процедуре registerFont (обратите внимание, эта процедура понимает на входе только объекты-шрифты, она не умеет регистрировать непосредственно ttf-файлы):
pdfmetrics.registerFont(MyFontObject)

Ну вот, самая муторная часть со всеми этими инициализациями завершена, теперь можно спокойно «рисовать» наш pdf-файл ‘hello.pdf’:
MyCanvas = canvas.Canvas(“hello.pdf”)

Устанавливаем в качестве текущего активного шрифта зарегистрированный нами ранее “Arial” с кеглем (размером шрифта) 40пт (типографских пунктов), с помощью метода setFont:
MyCanvas .setFont(“Arial”, 40)

И, наконец, то, ради чего, собственно, и заваривалась вся эта каша с инициализацией шрифта – пишем по-русски “Привет Мир”:
MyCanvas .drawString(200,400,“Привет Мир”)
MyCanvas .save()


А теперь, интереса ради, сравним размеры получившихся PDF-файлов первого (латинская надпись “Hello World”) и второго(кириллическая надпись “Привет Мир”) примеров. Первый файл будет весить 2 килобайта, а второй около 40 килобайт! В чем же причина? Дело в том, что во втором случае мы использовали дополнительный кириллический шрифт “Arial” и ReportLab “встроил” его в PDF-документ, чтобы гарантированно обеспечить возможность просмотра на любом компьютере.



Отредактировано (Авг. 24, 2007 10:17:05)

Офлайн

#6 Авг. 23, 2007 13:28:56

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

Ну вот, выкладываю еще две заметки. Вводную часть я хочу причесать еще малость - и тогда уж в архив.

Создаем многостраничный PDF файл.

Этот пример отличается от предыдущих лишь немногим – после отрисовки на холсте фразы «Hello World», укажем, что мы завершили работу с данной страницей и хотим перейти к следующей. Для этого необходимо вызвать метод showPage.


from reportlab.pdfgen import canvas
MyCanvas = canvas.Canvas("hello.pdf")
MyCanvas .drawString(270,410,"Hello World")
#завершаем работу с текущей страницей и переходим к следующей:
MyCanvas.showPage()
#еще раз приветствуем мир (но это попадет уже на вторую страницу):
MyCanvas .drawString(270,410,"Hello World again")
MyCanvas .save()

В итоге получаем двухстраничный PDF файл. Заметим, что если после вызова метода showPage ничего не отрисовать на «новой» странице, то эта «новая» страница создана не будет (хоть бы и пустая). Если же вам по каким-либо причинам все же захочется оставить следующие страницы пустыми, то вызовите showPage подряд дважды (трижды, и т.д).
Также обратите внимание, что при переходе на новую страницу, все текущие настройки холста «сбрасываются» к первоначальным значениям. То есть если вы меняли, скажем, размер, тип или цвет шрифта, поворачивали холст, увеличивали толщину линии и т.п., то все это будет распространяться только на текущую страницу, а после перехода на новую вызовом showPage() все эти изменения «рабочих инструментов» будут сброшены, и если они вам необходимы, то следует применить их снова .



Отредактировано (Авг. 23, 2007 13:38:03)

Офлайн

#7 Авг. 23, 2007 13:30:42

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

Единицы измерения

Далеко не всем привычно работать с типографскими пунктами в качестве основных единиц измерения, поэтому разработчики предусмотрительно включили в поставку модуль в котором определены также дюймы (inch), сантиметры (cm), миллиметры (mm) и пики (pica). В прошлый раз мы задавали координаты начала строки “Hello World” на холсте в типографских пунктах: 270 пт (оси X), 410 пт (по оси Y) - MyCanvas.drawString(270,410,“Hello World”) А теперь будем использовать сантиметры:

Пример 4:

from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
MyCanvas = canvas.Canvas("Hello.pdf")
MyCanvas .drawString(10*cm,15*cm,"Hello World")
MyCanvas .save()


Разбираем новые строки кода:

Чтобы оперировать родными сантиметрами, импортируем константу ‘cm’ из модуля units:
from reportlab.lib.units import cm

Ну а теперь задаем координаты выводимой строки “Hello World” уже в сантиметрах - 10 см (по оси X) и 15 см (по оси Y) (!обязательно со знаком умножения ‘*’):
MyCanvas .drawString(10*cm,15*cm,"Hello World")
Точно таким же образом можно использовать дюймы или миллиметры – достаточно импортировать соответствующие константы из модуля units и указывать их потом, например, в виде: 5*inch или 20.7*mm.

Для любознательных: Кроме того, при желании вы легко можете добавить и какие-нибудь экзотические единицы измерения – для этого достаточно подредактировать модуль units.py в папке «reportlab/lib/» - вот его содержание:

inch = 72.0
cm = inch / 2.54
mm = cm * 0.1
pica = 12.0
# просто засилье буржуйских метрик какое-то, добавим-ка сюда аршин:
arshin = inch*28
Как видите, все константы в конечном счете преобразуются в типографские пункты, поэтому фактически, скажем, аргумент 5*inch будет преобразован к 5*72.0 пт, что будет равно 360 пт. Именно поэтому, знак умножения «*» в данном случае не просто прихоть разработчиков, а необходимый оператор приведения к типографским пунктам.



Отредактировано (Сен. 3, 2007 08:51:33)

Офлайн

#8 Авг. 31, 2007 10:46:14

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

Меняем размер/ориентацию страницы.

Полагаю, вы уже успели заметить, что если не сообщить ReportLab’у о размерах создаваемой страницы, то он сгенерирует привычный A4, поскольку этот формат является стандартом де-факто как у нас, так и в Европе.
Разумеется, размер и ориентацию страницы при необходимости можно поменять. Причем, мы можем воспользоваться как готовыми наборами стандартных форматов (A0…A6, B0…B6, американские Letter и Legal) из модуля reportlab/lib/pagesizes.py, так и указать произвольный размер листа в пт, см, дюймах и т.д.
Задавать размер страницы можно как на этапе инициализации холста, так и в процессе отрисовки на холст.

Пример 5 (задаем размер страницы при инициализации холста):

from reportlab.pdfgen import canvas
#импортируем формат A5 из модуля reportlab/lib/pagesizes.py
from reportlab.lib.pagesizes import A5
#создаем холст MyCanvas, а в качестве аргументов передаем конструктору
#класса не только имя будущего PDF файла (как мы делали раньше), но и
#размер страницы – A5 (14.8 x 21.0 см): 
MyCanvas = canvas.Canvas("hello.pdf", pagesize=A5)
MyCanvas .drawString(200,300,"Hello World")
MyCanvas .save()
Теперь первая и все последующие (если таковые имеются) страницы этого документа будут A5-го формата.

А сейчас создадим документ у которого первая страница будет стандартная A4 (но с альбомной ориентацией), вторая произвольного размера (например, 15x15 см), а третья и все последующие - A5 с книжной ориентацией.
Пример 6
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A4, A5, landscape, portrait
#При создании документа сразу задаем размер страницы A4 и
#приводим ее к альбомной ориентации (функция landscape):
MyCanvas = canvas.Canvas("hello.pdf", pagesize=landscape(A4))
MyCanvas .drawString(200,300,"Hello World")
MyCanvas .showPage()
#Вторую страницу сделаем произвольного размера (15X15см) при помощи
#метода setPageSize(), которому следует передать кортеж с размерами
#по горизонтали и вертикали:
MyCanvas .setPageSize((15*cm, 15*cm))
MyCanvas .drawString(200,300,"Hello World")
MyCanvas .showPage()
#Третья страница у нас будет A5 книжной ориентации (функция portrait).
#В принципе, функцию portrait можно не применять - по умолчанию ориентация
#и так окажется книжной, но мы явно пропишем это, чтобы продемонстрировать
#наличие такой возможности:
MyCanvas .setPageSize(portrait(A5))
MyCanvas .drawString(200,300,"Hello World")
MyCanvas .showPage()
#Напоследок трижды вызываем метод showPage() (создаем три пустых страницы),
#чтобы продемонстрировать, что после любых изменений размера листа эти
#изменения остаются в силе вплоть до закрытия холста:
MyCanvas .showPage()
MyCanvas .showPage()
MyCanvas .showPage()
MyCanvas .save()



Офлайн

#9 Авг. 31, 2007 11:02:30

Teddy Bear
От:
Зарегистрирован: 2007-03-02
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

Стараюсь держать темп )). Кроме того, откопал замечательный пакет для генерации на лету rtf-файлов pyRTF и потратил немало времени на его русификацию - как руки дойдут опубликую ))



Офлайн

#10 Сен. 5, 2007 10:01:21

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Изучаем ReportLab. Вводная часть...

Teddy Bear
Кроме того, откопал замечательный пакет для генерации на лету rtf-файлов pyRTF и потратил немало времени на его русификацию…
Это вот это? А в каком смысле “русификация”? Кстати, проект производит впечатление заброшенного: до финального релиза так и не дошёл (v0.45), последнее обновление 9th May 2005.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version