воскресенье, 27 февраля 2011 г.

ReportLab и Python начало

Как то раз понадобилось в одной из программ на Python выводить результат работы не только на экран но и на печать.
Первое что попалось на глаза оказался ReportLab (http://www.reportlab.com)

Вернее попался он на глаза в книге - Гифт, Джонс  "Питон в системном администрировании" . Установка библиотеки прошла без проблем в одну команду - sudo apt-get install reportlab   (вот за это люблю я пакетные менеджеры). И начались эксперименты. Оказалось что если рисовать на канве то расположение элементов и переходы на другую страницу нужно выставлять самостоятельно. После вдумчивого чтения документации и гугления стало понятно, что если лень делать самому то нужно использовать подсистему ReportLab'а - platypus. Так же обнаружилось, что ReportLab по умолчанию ставит себе Type 1 шрифты без русского языка.
Решений данной проблемы как всегда несколько:
  1. Заменть шрифты на шрифты с русским набором символов
  2. Сделать симлинки в каталоге ReportLab'а на нужные Type 1 шрифты
  3. Загрузить TryeType шрифты.
Был выбран вариан но #3. В результате рабочий тестовый пример выглядит таким образом :

#!/usr/bin/env python
#-*- coding: UTF-8 -*-

from reportlab.platypus import Paragraph,SimpleDocTemplate
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import A4
import reportlab.rl_config
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

class CreateRep:
    def __init__(self):
        # пути к фонтам и регистрация фонта
        reportlab.rl_config.TTFSearchPath='/usr/share/fonts/truetype/freefont'
        pdfmetrics.registerFont(TTFont('FreeSans', '/usr/share/fonts/truetype/freefont/FreeSans.ttf'))
        reportlab.rl_config.TTFSearchPath='/usr/share/fonts/truetype/ttf-dejavu'
        pdfmetrics.registerFont(TTFont('DejaVu Serif','/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf'))
        story=[]  # словарь документа
        styles = getSampleStyleSheet() # дефолтовые стили
        # создаем объект документа с размером страницы A4
        doc=SimpleDocTemplate('test.pdf',pagesize = A4,title='Тест документа',author='CAV Inc')
        story.append(Paragraph("The Platypus", styles['Heading1']))
        story.append(Paragraph('<font name="FreeSans">ЭТО СПАРТА !!!</font>', styles['Normal']))
        for i in xrange(500):
             story.append(Paragraph("Line in %s " % str(i),styles["Normal"]))
             story.append(Paragraph('<font name="DejaVu Serif">Line in %s линия </font>' % str(i),styles["Normal"]))
        doc.build(story)


cr=CreateRep()
print "усе"

Выбор нужного шрифта как видите реализован с помощью HTML тегов, но можно и через создания собственных стилей

Комментариев нет:

Отправить комментарий