Да-а, ребята, это было непросто. Документация, конечно, есть, но в ней чёрт ногу сломит, а большая часть примеров вовсе даже на Basic. А мы вот попробуем something completely different - на Питоне.
ТЗ: Имеется папка, в ней тыща миллион до неба картинок jpg. Картинки требуется вставлять попарно в документ OpenOffice Writer между абзацами текста. То есть поставил курсор - воткнул следующую пару картинок - поехал дальше. Посмотрим, что мы можем сделать.
Прежде всего: питоновские скрипты не редактируются в самом OpenOffice. Редактируем их в чём угодно и загружаем в специальную папку - при стандартной установке на Windows это C:\Program Files\OpenOffice 4\share\Scripts\python . Там должны уже лежать встроенные скриптики типа HelloWorld.py.
ОК, что же нужно написать в нашем файле, чтобы сделать красиво? Разберём построчно.
Подгружаем нужные библиотеки
from com.sun.star.awt import Size
from PIL import Image #Если вы придумаете, как по-другому определять размер картинки, можно эту строчку пропустить. Если нет, то нужно скачать библиотеку PIL (гугл в помощь) и загрузить в папку питона в OpenOffice: C:\Program Files\OpenOffice 4\program\python-core-2.7.6\lib\site-packages
Тут у нас четыре функции. При вызове макроса исполняется последняя, первые три - вспомогательные.
def AddGraphic(pbreak):
st = getImagePath() # Вторая вспомогательная функция. Вторая и третья нужны для того, чтобы последовательно переходить от картинки к картинке в заданной папке.
oDoc = XSCRIPTCONTEXT.getDocument() # Получаем открытый документ
oText = oDoc.Text #Получаем текст документа
VC = oDoc.CurrentController.ViewCursor #Получаем объект курсора
GraphObj = oDoc.createInstance("com.sun.star.text.GraphicObject") # Создаём картинку
GraphObj.GraphicURL = 'file:///' + st # Источник картинки - наш очередной файл. Не забываем про приставку file:///
img = Image.open(st) #В следующих строчках мы при помощи библиотеки PIL получаем размер изображения, чтобы правильно смасштабировать его высоту при заданной ширине. Вообще-то предполагается, что у GraphicObject есть свойство ActualSize, в документации оно вроде как прописано, но на деле у меня ругалось, что такого свойства нет - пришлось выкручиваться.
if img.size[1] > 0:
prop = float(img.size[0])/float(img.size[1])
imgsize = Size(8500, (8500 / prop) ); # 8500 - это чуть меньше половины ширины страницы (8.5 см) - я нагло и беспардонно посмотрела ширину, потому что искать, как высчитать её программно, уже не было времени и сил. Если у вас получится, отпишитесь в комменты))
GraphObj.setSize(imgsize)
# Если это первая картинка, выравниваем по левому краю, если вторая - по правому
if(pbreak == 1):
GraphObj.HoriOrient = 1
else:
GraphObj.HoriOrient = 0
# Вставляем изображение
oText.insertTextContent(VC.Start, GraphObj, False)
# Если это вторая картинка, создаём новый абзац
if(pbreak == 1):
oText.insertControlCharacter(VC.Start, 0, False)
#Есть мнение, что после всего этого нужно обновить документ. Не заметила особых изменений, но пусть будет.
oDoc.refresh()
def getImagePath(): # У меня всё облегчается тем, что изображения пронумерованы, поэтому мы просто прибавляем цифирку к номеру. Впрочем, просто перебрать все картинки в папке особого труда тоже не составит.
dir = 'D:/mymages/image-'
type = '.jpg'
num = getNumber()
st = dir + num + type
return st
def getNumber(): # Чтобы сохранить номер последней загруженной картинки, используем текстовый файл-счетчик
file = "D:/counter.txt"
num = 0
f = open(file, 'r+')
num = f.read()
f.seek(0)
newnum = str(int(num) + 1)
f.write(newnum)
f.close()
return num
def InsertImage( ): #Два раза вызываем функцию вставки картинок, второй раз после этого переходим на новый абзац
AddGraphic(0)
AddGraphic(1)
return None
# В качестве макроса нам нужна только основная функция, так и пишем.
g_exportedScripts = InsertImage
Скачать файл можно тут. На самом деле, даже нужно, это же Python, вряд ли вы захотите потом исправлять все отступы. Удачи!
ТЗ: Имеется папка, в ней тыща миллион до неба картинок jpg. Картинки требуется вставлять попарно в документ OpenOffice Writer между абзацами текста. То есть поставил курсор - воткнул следующую пару картинок - поехал дальше. Посмотрим, что мы можем сделать.
Прежде всего: питоновские скрипты не редактируются в самом OpenOffice. Редактируем их в чём угодно и загружаем в специальную папку - при стандартной установке на Windows это C:\Program Files\OpenOffice 4\share\Scripts\python . Там должны уже лежать встроенные скриптики типа HelloWorld.py.
ОК, что же нужно написать в нашем файле, чтобы сделать красиво? Разберём построчно.
Подгружаем нужные библиотеки
from com.sun.star.awt import Size
from PIL import Image #Если вы придумаете, как по-другому определять размер картинки, можно эту строчку пропустить. Если нет, то нужно скачать библиотеку PIL (гугл в помощь) и загрузить в папку питона в OpenOffice: C:\Program Files\OpenOffice 4\program\python-core-2.7.6\lib\site-packages
Тут у нас четыре функции. При вызове макроса исполняется последняя, первые три - вспомогательные.
def AddGraphic(pbreak):
st = getImagePath() # Вторая вспомогательная функция. Вторая и третья нужны для того, чтобы последовательно переходить от картинки к картинке в заданной папке.
oDoc = XSCRIPTCONTEXT.getDocument() # Получаем открытый документ
oText = oDoc.Text #Получаем текст документа
VC = oDoc.CurrentController.ViewCursor #Получаем объект курсора
GraphObj = oDoc.createInstance("com.sun.star.text.GraphicObject") # Создаём картинку
GraphObj.GraphicURL = 'file:///' + st # Источник картинки - наш очередной файл. Не забываем про приставку file:///
img = Image.open(st) #В следующих строчках мы при помощи библиотеки PIL получаем размер изображения, чтобы правильно смасштабировать его высоту при заданной ширине. Вообще-то предполагается, что у GraphicObject есть свойство ActualSize, в документации оно вроде как прописано, но на деле у меня ругалось, что такого свойства нет - пришлось выкручиваться.
if img.size[1] > 0:
prop = float(img.size[0])/float(img.size[1])
imgsize = Size(8500, (8500 / prop) ); # 8500 - это чуть меньше половины ширины страницы (8.5 см) - я нагло и беспардонно посмотрела ширину, потому что искать, как высчитать её программно, уже не было времени и сил. Если у вас получится, отпишитесь в комменты))
GraphObj.setSize(imgsize)
# Если это первая картинка, выравниваем по левому краю, если вторая - по правому
if(pbreak == 1):
GraphObj.HoriOrient = 1
else:
GraphObj.HoriOrient = 0
# Вставляем изображение
oText.insertTextContent(VC.Start, GraphObj, False)
# Если это вторая картинка, создаём новый абзац
if(pbreak == 1):
oText.insertControlCharacter(VC.Start, 0, False)
#Есть мнение, что после всего этого нужно обновить документ. Не заметила особых изменений, но пусть будет.
oDoc.refresh()
def getImagePath(): # У меня всё облегчается тем, что изображения пронумерованы, поэтому мы просто прибавляем цифирку к номеру. Впрочем, просто перебрать все картинки в папке особого труда тоже не составит.
dir = 'D:/mymages/image-'
type = '.jpg'
num = getNumber()
st = dir + num + type
return st
def getNumber(): # Чтобы сохранить номер последней загруженной картинки, используем текстовый файл-счетчик
file = "D:/counter.txt"
num = 0
f = open(file, 'r+')
num = f.read()
f.seek(0)
newnum = str(int(num) + 1)
f.write(newnum)
f.close()
return num
def InsertImage( ): #Два раза вызываем функцию вставки картинок, второй раз после этого переходим на новый абзац
AddGraphic(0)
AddGraphic(1)
return None
# В качестве макроса нам нужна только основная функция, так и пишем.
g_exportedScripts = InsertImage
Скачать файл можно тут. На самом деле, даже нужно, это же Python, вряд ли вы захотите потом исправлять все отступы. Удачи!
Автору спасибо. Одна из лучших статей по программированию макросов для OOO на Python
ОтветитьУдалитьО, кому-то это оказалось нужно! Здорово)
Удалить