Форум сайта python.su
pythonwinReportLab есть в репозитариях большинства дистрибутивов Linux, так что достаточно скачать пакет и установить его.
+ хорошо бы описать установку и на другие ОС
yum install python-reportlab
Офлайн
тогда почему в винде так страшно ставиться?
Офлайн
pythonwinБо винда страшная ;)
тогда почему в винде так страшно ставиться?
Офлайн
baluне думаю что в этом случае винда виновата:
Бо винда страшная ;)
Teddy Bearи не нужно ничего разархивировать :)
Разархивируем ReportLab в папку где установлен Python, должно получиться примерно следующее: в каталоге C:\Python25\reportlab\ у вас будут
лежать папки и файлы с именами demos, pdfgen, platypus, rl_config.py и т.д. ( напр. C:\Python25\reportlab\rl_config.py )
Отредактировано (Авг. 10, 2007 13:11:34)
Офлайн
Итак, подробно разбираем второй пример:
# -*- 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)
Офлайн
Ну вот, выкладываю еще две заметки. Вводную часть я хочу причесать еще малость - и тогда уж в архив.
Создаем многостраничный 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()
Отредактировано (Авг. 23, 2007 13:38:03)
Офлайн
Единицы измерения
Далеко не всем привычно работать с типографскими пунктами в качестве основных единиц измерения, поэтому разработчики предусмотрительно включили в поставку модуль в котором определены также дюймы (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()
from reportlab.lib.units import cm
MyCanvas .drawString(10*cm,15*cm,"Hello World")
inch = 72.0 cm = inch / 2.54 mm = cm * 0.1 pica = 12.0 # просто засилье буржуйских метрик какое-то, добавим-ка сюда аршин: arshin = inch*28
Отредактировано (Сен. 3, 2007 08:51:33)
Офлайн
Меняем размер/ориентацию страницы.
Полагаю, вы уже успели заметить, что если не сообщить 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()
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()
Офлайн
Стараюсь держать темп )). Кроме того, откопал замечательный пакет для генерации на лету rtf-файлов pyRTF и потратил немало времени на его русификацию - как руки дойдут опубликую ))
Офлайн
Teddy BearЭто вот это? А в каком смысле “русификация”? Кстати, проект производит впечатление заброшенного: до финального релиза так и не дошёл (v0.45), последнее обновление 9th May 2005.
Кроме того, откопал замечательный пакет для генерации на лету rtf-файлов pyRTF и потратил немало времени на его русификацию…
Офлайн