Форум сайта python.su
Продолжаю свои поиски генераторов отчетов. На этот раз разговор пойдет о PyRTF. Это не значит, что ReportLab забыт, просто сегодня у меня такое настороение ;).
PyRTF – библиотека для создания RTF (Rich Text Format) файлов средствами языка Python.
Краткое описание:
PyRTF – это библиотека для создания RTF документов непосредственно из Python скриптов. У библиотеки нет внешних зависимостей (написана на чистом Python), в тестах разработчиков она показала себя вполне стабильным и быстрым инструментом.
PyRTF была протестирована на следующих ОС: W2K, WinXP, GNU/Linux, OpenBSD, FreeBSD и на следующих текстовых редакторах: OpenOffice, Word95, Word97, Word2000, WordXP и MacWord.
Функционал:
- Стили:
Предоставляется стандартный набор стилей, но допускается создание произвольных наборов стилей, что позволяет генерировать комплекты документов, которые соответствуют нормативам оформления для конкретного предприятия.
Стили могут быть переопределены практически на любом уровне, таким образом базовая структура документа может быть привязана к некоторому набору стилей, а переопределение стилей производится только в необходимых местах. Например жирное начертание, курсив, подчеркивание и т.д. могут быть применены лишь к тем элементам, которые того требуют.
- Разделы документа:
Документы могут содержать многочисленные разделы, каждый раздел может обладать своим собственным размером страницы, набором стилей, верхним и нижним колонтитулом. Поддерживаются и колонтитулы, которые применяются только к первой странице раздела.
- Таблицы:
Имеется всесторонняя поддержка таблиц, в PyRTF реализованы практически все особенности оформления таблиц входящие в спецификацию формата RTF. Таблицы конструируются из базовых “строительных блоков”, таким образом, если вы ознакомились с основами, то таблицы относительно легки в обхождении.
- Изображения:
Поддерживается встраивание как растровых изображений (форматов PNG и JPG), так и векторных (EMF).
PDF формат идеально подходит для кроссплатформенной печати, но если пользователю необходимо оперативно внести коррективы в сгенерированный документ, то тут возникают проблемы. И в данном случае чуть ли не единственным выбором становится формат RTF - редакторы под все платформы имеются в избытке, спецификация формата открытая, возможности, конечно не такие богатые как в PDF, да и гарантий, что он будет выглядеть “один-в-один” на разных платформах тоже никто не даст. Ну, всегда приходится чем-то жертвовать.
Итак, PyRTF. Несмотря на заброшенность проекта (последние изменения датируются началом 2006 года) и “зеленый” номер версии (0.46), возможности у неё, в целом, очень даже зрелые, да и в плане стабильности особо не придерешься. Самый большой недостаток - это практически полное отсутствие документации - в наличии имеется лишь подборка из примеров, демонстрирующих основные возможности. Еще одна неприятная мелочь - отсутствие поддержки юникода. Из возможностей мне остро недостает только так называемой “text box” - это такие фреймы в которые можно помещать текст и располагать их в любом месте листа хоть поверх друг друга (если дойдут руки, то попробую самостоятельно реализовать этот элемент).
Пришлось потратить некоторое время на “русификацию” PyRTF, чтобы в RTF файлах отображалась кириллица вместо кракозябр. Вот что для этого нужно сделать:
1) В модуле pyRTF/PropertySets.py находим класс Font:
class Font :
def __init__( self, name, family, character_set = 0, pitch = None, panose = None, alternate = None ) :
StandardFonts.append( Font( 'Arial', 'swiss' , 0, 2, '020b0604020202020204' ) )
...
...
StandardFonts.append( Font( 'Verdana', 'swiss' , 0, 2, '020b0604030504040204' ) )
self._write( "{\\rtf1\\ansi\\ansicpg1252\\deff0%s\n" % settings )
Отредактировано (Сен. 6, 2007 12:37:16)
Офлайн
Teddy BearПосмотри на pyExcelerator Лучшего пока не знаю.
Продолжаю свои поиски генераторов отчетов.
Офлайн
ИМХО, такие руссификации – это неловкий хак. Лучше бы доработать уже до полной интернационализации, чтобы любой язык можно было юзать. Что эти замены 0 на 204 значат? Как вы их подобрали?
Офлайн
Спору нет, иначе как грязным хаком это не назовешь, но полноценный перевод PyRTF на юникод занял бы как минимум в 10 раз больше времени, поэтому не обессудьте.
По поводу замены '0' на '204':
В спецификации формата RTF указано, что "тег \fcharset определяет набор символов в таблице шрифта (т.е. кодовую страницу), а значения которые он может принимать можно отыскать в заголовочных файлах Windows и в файле RTFDEFS.H, входящем в комплект данной спецификации".
Я не обнаружил его в комплекте спецификации, но в интернете нашел майкрософтовский заголовочный файл wingdi.h в котором, в частности, есть следующие строки:
//****** CHARSETS *******
#define ANSI_CHARSET 0
#define DEFAULT_CHARSET 1
#define SYMBOL_CHARSET 2
#define SHIFTJIS_CHARSET 128
#define HANGEUL_CHARSET 129
#define GB2312_CHARSET 134
#define CHINESEBIG5_CHARSET 136
#define OEM_CHARSET 255
#if(WINVER >= 0x0400)
#define JOHAB_CHARSET 130
#define HEBREW_CHARSET 177
#define ARABIC_CHARSET 178
#define GREEK_CHARSET 161
#define TURKISH_CHARSET 162
#define THAI_CHARSET 222
#define EASTEUROPE_CHARSET 238
#define RUSSIAN_CHARSET 204
#define MAC_CHARSET 77
#define BALTIC_CHARSET 186
//***********************
Офлайн
а что говорит спецификация формата по поводу unicode?
Офлайн
Вот что получилось с украинским текстом:
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fcharset204{\*\fname Arial;}Arial CYR;}}
\viewkind4\uc1\pard\lang1058\f0\fs20\'cf\'f0\'e8\'e2\'b3\'f2, \'f6\'e5 \'ef\'f0\'e8\'ea\'eb\'e0\'e4 \'f3\'ea\'f0\'e0\'bf\'ed\'f1\'fc\'ea\'ee\'e3\'ee \'f2\'e5\'ea\'f1\'f2\'f3\lang1049\par
}
Офлайн
Кстати по поводу интересного тега \lang в теле RTF
>>> import locale
>>> locale.windows_locale
'ru_RU'
>>> locale.windows_locale
'uk_UA'
Офлайн
Teddy Bear
Хочу выразить благодарность за такие подробности в исследовании нового для меня модуля))
Офлайн
Изучение спецификации RTF и мои эксперименты показали, что теги \deflang и \lang не имеют отношения к кракозябрам в RTF-файлах. Эти теги лишь указывают текстовому редактору язык для проверки грамматики и орфографии (т.е. если задать их неправильно, то, например, все слова, даже правильно написанные, в word'е будут подчеркнуты красной волнистой линией).
При настройке PyRTF на русский язык, мы косвенно устанавливали эти теги в п.3 : если посмотреть модуль pyRTF/Constants.py в котором мы меняли атрибут DEFAULT=EnglishAustralian на DEFAULT=Russian, то увидим там строки
class Languages : NoLanguage = 1024 Albanian = 1052 Arabic = 1025 Bahasa = 1057 BelgianDutch = 2067 BelgianFrench = 2060 BrazilianPortuguese = 1046 Bulgarian = 1026 Catalan = 1027 CroatoSerbianLatin = 1050 Czech = 1029 Danish = 1030 Dutch = 1043 EnglishAustralian = 3081 EnglishUK = 2057 EnglishUS = 1033 Finnish = 1035 French = 1036 FrenchCanadian = 3084 German = 1031 Greek = 1032 Hebrew = 1037 Hungarian = 1038 Icelandic = 1039 Italian = 1040 Japanese = 1041 Korean = 1042 NorwegianBokmal = 1044 NorwegianNynorsk = 2068 Polish = 1045 Portuguese = 2070 RhaetoRomanic = 1047 Romanian = 1048 Russian = 1049 SerboCroatianCyrillic = 2074 SimplifiedChinese = 2052 Slovak = 1051 SpanishCastilian = 1034 SpanishMexican = 2058 Swedish = 1053 SwissFrench = 4108 SwissGerman = 2055 SwissItalian = 2064 Thai = 1054 TraditionalChinese = 1028 Turkish = 1055 Urdu = 1056 SesothoSotho = 1072 Afrikaans = 1078 Zulu = 1077 Xhosa = 1076 Venda = 1075 Tswana = 1074 Tsonga = 1073 FarsiPersian = 1065
Отредактировано (Сен. 8, 2007 11:19:56)
Офлайн
Поскольку так править исходники не труъ, то я написал мелкую обертку вокруг PyRTF: PyRuRTF, два доп.класса: RussianDocument и RussianRenderer, используются соответственно вместо Document и Renderer. Всё остальное остается as is.
http://dumpz.org/2017/
пример: http://dumpz.org/2014/
upd: http://hg.pyobject.ru/pyrurtf/ (с поддержкой юникода)
Отредактировано (Авг. 26, 2008 10:20:21)
Офлайн