OpenOffice + Python, pабота с файлами MS Word

Пару недель назад для проекта Grammarly Handbook понадобилось импортировать много форматированного текста из документов MS Word. Текст находился в 40 файлах размером от одной до двадцати страниц. Первые несколько страниц я перенес вручную и несколько утомился - механическая работа меня не очень радует. Начал искать возможность читать вордовские документы из Питона.

У меня был очень позитивный опыт с библиотеками xlrd, xlwt. Первая читает документы Excel, а вторая - записывает. Но подобных библиотек для документов *.doc я не нашел. Зато нашел возможность обращаться из Python к OpenOffice. Эту возможность я успешно использовал, успешно импортировал весь грамматический материал и даже наткнулся на интересную идею для нашего основного продукта - инструмента проверки грамматики Grammarly.

Установка OpenOffice и python-uno

Сначала я поставил OpenOffice под Mac OS X, но оказалось что python bindings там только для python версии 2.3. То же самое справедливо и для Windows. Благо у меня всегда под рукой VirtualBox, в котором установлена Ubuntu. Для чистоты эксперимента я прямо сейчас поставлю чистую Ubuntu 11.04, куда и поставлю все необходимые пакеты.

sudo aptitude install openoffice.org openoffice.org-writer python-uno

В Ubuntu 11.04 вместо OpenOffice используется независимый от Oracle форк LibreOffice. Запускаем LibreOffice и говорим ему слушать порт 2002:

libreoffice -accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"

Работа с документами

Ставим ipython и git-core. Клонируем вспомогательные функции python-uno-utils, которые я выложил в github gist. Запускаем ipython из папки с python-uno-utils.

sudo aptitude install ipython git-core
git clone git://gist.github.com/923032.git python-uno-utils
cd python-uno-utils
ipython

Сначала нужно импортировать модуль uno - в нем есть import hooks, которые выполнят всю необходимую магию, чтобы в нашей питоновской консоли работал python-uno.

In [1]: import uno

Затем подключаем python-uno-utils

In [2]: %run python-uno-utils.py

Команда %run выгодно отличается от import тем, что после изменения файла достаточно выполнить команду повторно и продолжать работать с уже измененными функциями-классами без перезагрузки консоли.

Открываем документ hello.doc, который я создал специально для этой статьи. Видим как появляется новое окно LibreOffice с этим документом.

In [3]: doc = open_document('http://dl.dropbox.com/u/318944/python-uno/hello.doc')

Screenshot - opened document

Документ состоит из параграфов:

In [4]: print_elements(doc.Text)
Привет!

Это список:
Раз
Два
Три

Разные цвета: красный, зеленый, синий.

Bold, italic.

Каждый параграф может состоять из кусочков (spans) с разным форматированием.

In [5]: l = list_elements(doc.Text)
In [6]: print l[7].getString()
Разные цвета: красный, зеленый, синий.

In [7]: print_elements(l[7])
Разные цвета:
красный
,
зеленый
,
синий
.

In [8]: l = list_elements(l[7])

In [9]: color(l[0])
Out[9]: 'black'

In [10]: color(l[1])
Out[10]: 'red'

In [11]: color(l[2])
Out[11]: 'black'

In [12]: color(l[3])
Out[12]: 'green'

In [13]: color(l[4])
Out[13]: 'black'

In [14]: color(l[5])
Out[14]: 'blue'

In [15]: color(l[6])
Out[15]: 'black'

После успешной работы с документом, закрываем его:

In [16]: doc.dispose()

Также смотрите в python-uno-tools: iter_elements, nonempty_elements, is_leaf, is_bold, is_italic, is_underline, is_list.

Дополнительная информация - http://lucasmanual.com/mywiki/OpenOffice.

comments powered by Disqus