2011-03-28

Использование Python для управления документами OpenOffice.org

# Установка библиотеки uno для python
sudo apt-get install python-uno

Запуск OpenOffice с возможностью им управлять, т.е. в "слушающем" режиме. Несколько опций:
-writer : чтобы сразу запустился Writer
-headless : если хотим запустить без GUI

Остальные по вкусу: -nologo -nofirststartwizard -norestore, понятно по названию.

soffice "-accept=socket,host=localhost,port=2002;urp;" -writer -headless

Если OOo запущен в режиме без GUI, выключить его можно так:
killall soffice.bin

Начинаем наш код.

import uno
local = uno.getComponentContext()
resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local)
context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")

# Загрузка сервисов
desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)

# Получить текущий документ
document = desktop.getCurrentComponent()

# Создать новый документ
document = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())

# Загрузить существующий документ
document = desktop.loadComponentFromURL("file:///home/lucas/myfile.odt" ,"_blank", 0, ())

# Установить курсор
cursor = document.Text.createTextCursor()

# Добавим некий текст
document.Text.insertString(cursor, "Этот текст был добавлен в OOo путем использования python и пакета uno.", 0)

# Переносы строк: \n, отступы: \t
document.Text.insertString(cursor, "\n\n\tНовый параграф.", 0)

# Получаем свойство символа - кегль шрифта
cursor.getPropertyValue("CharHeight")

# Изменяем свойства символов: кегль и имя шрифта, его жирность
cursor.setPropertyValue("CharHeight", 20)
cursor.setPropertyValue("CharFontName", "Arial")
cursor.setPropertyValue("CharWeight", 150)

# Создаем таблицу шириной 2 колонки и высотой в 6 строк
mytable = document.createInstance("com.sun.star.text.TextTable")
mytable.initialize(6,2)
# Вставляем таблицу в страницу
document.Text.insertTextContent(cursor, mytable, 0)

# Заполняем несколько полей
mytable.getCellByName("A1").setString("Полюшко-поле A1")
mytable.getCellByName("B2").setString("Поле, русское поле B2")
mytable.getCellByPosition(1,4).setString('А можно и так')

# Сохраняем
document.store()

# Сохраняем как новый(другой) файл
document.storeAsURL("file:///home/lucas/myfile2.odt",())

# Сохраняем как копию, и остаемся в том-же документе
document.storeToURL("file:///home/lucas/myfile2.odt",())

# Завершаем работу с документом
document.dispose()

# Поиск и замена. Работаем со строками
import string

# Создаем дескриптор поиска
search = document.createSearchDescriptor()

# Что ищем?
search.SearchString = u"Люк"

# Ищем первое найденное
found = document.findFirst( search )

# заменяем найденное и ищем дальше, пока не закончатся искомые фразы
while found:
found.String = string.replace( found.String, u"Люк", u"Люк, я твой отец" )
found = document.findNext( found.End, search)

# Некоторые возможности поиска: чувствительность к регистру или поиск слов
search.SearchCaseSensitive = True
search.SearchWords = True

# Или поиск по регулярным выражениям
search.SearchRegularExpression = True
search.SearchString = "\\<(k|s|v|z|o|u|i|a) "

# Экспорт в PDF. Придется импортировать соответствующую библиотеку
from com.sun.star.beans import PropertyValue
property = (
    PropertyValue( "FilterName" , 0, "writer_pdf_Export" , 0 ),
)
document.storeToURL("file:///home/lucas/myfile2.pdf",property)

# Импорт разрывов шаблона страницы, вставка разрыва в конец документа и импорт еще одного документа из файла
from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER
cursor.gotoEnd(False)
cursor.BreakType = PAGE_BEFORE
cursor.insertDocumentFromURL("file:///home/lucas/temp.odt", ())


Оригинал статьи на английском (немного добавил от себя и кое-что изменил)

2011-03-21

Глюк IE с текстом в абсолютно спозиционированном элементе

Дано:
<div style='position:absolute; top:200px;left:100px; width:500px;'>Длинный-предлинный текст, абзаца эдак на три.</div>
Наблюдаем глюк: только в IE (проверялось в 7 и 8 версии) текст не переносится на другую строку, а растягивает div за пределы страницы.
Решение: обернуть div таблицей.
<table><tr><td><div style='position:absolute; top:200px;left:100px; width:500px;'>Длинный предлинный текст, абзаца эдак на три.</div></td></tr></table>