Управляйте Libreoffice Impress из Python
Я пишу приложение, ориентированное на докладчиков и конференции. Я пишу это с Python и ориентирован на Linux.
Я хотел бы знать, возможно ли каким-либо образом управлять LibreOffice Impress с помощью Python, под Linux.
Я хочу запустить экземпляр LibreOffice Impress с загруженным файлом.odp из моего приложения Python. Затем я хотел бы получить от odp некоторую информацию, такую как: предыдущий, текущий и следующий слайд. Или как-то генерировать изображения слайдов на ходу.
Наконец, я хочу контролировать LibreOffice в режиме реального времени. Это: перемещаться по слайдам с помощью клавиш со стрелками; Право и лево.
Идея в том, чтобы использовать только Python, но я не против использования внешних библиотек или фреймворков.
Большое спасибо.
3 ответа
Наконец, я нашел способ решить эту проблему с помощью Python, элегантным и простым способом. Вместо библиотек или API я использую сокет для подключения к Impress и управления им.
В конце поста вы можете прочитать полный текст, который показывает, как управлять Impress таким образом. Это легко и удивительно.
Вы отправляете сообщение с помощью Python для Impress (который прослушивает какой-то порт), он получает сообщение и выполняет действия на основе вашего запроса.
Вы должны включить эту функцию "удаленного управления" в приложении. Я решил свою проблему, используя это.
Спасибо за ваши ответы!
Спецификация удаленного протокола LibreOffice Impress
Связь осуществляется через поток символов в кодировке UTF-8. (Использование RTL_TEXTENCODING_UTF8 в части LibreOffice.)
TCP
Дополнительные подробности о TCP и настройке и первоначальном рукопожатии должны быть записаны, но фактический протокол сообщений такой же, как для Bluetooth.
Формат сообщения
Сообщение состоит из одной или нескольких строк. Первая строка - это описание сообщения, в дальнейшие строки можно добавить любые необходимые данные. Пустая строка завершает сообщение.
Т.е. "СООБЩЕНИЕ \n\n" или "СООБЩЕНИЕ \nDATA\nDATA2...\n\n"
Вы должны продолжать читать сообщение до тех пор, пока не будет достигнута пустая строка (т. Е. Двойная новая строка), чтобы обеспечить возможность расширения протокола в будущем.
Intialisation
После подключения сервер отправляет "LO_SERVER_SERVER_PAIRED". (То есть "LO_SERVER_SERVER_PAIRED\n\n" отправляется по потоку.)
Впоследствии сервер отправит слайд-шоу, если слайд-шоу запущено, или слайд-шоу, если слайд-шоу не запущено. (См. Ниже для деталей.)
Затем текущая реализация сервера переходит к отправке всех заметок и предварительных просмотров слайдов клиенту. (Это следует изменить, чтобы избежать проблем с памятью, и реализовать механизм запроса предварительного просмотра.)
Команды (клиент-сервер)
Клиент не должен предполагать, что состояние сервера изменилось после отправки команды. Все изменения будут переданы обратно клиенту. (Это необходимо для случаев, когда несколько клиентов запрашивают различные изменения и т. Д.)
Любые строки в [квадратных скобках] являются необязательными и должны быть опущены, если не нужны.
- transition_next
transition_previous
goto_slide slide_number
presentation_start
presentation_stop
presentation_resume // Возобновляет после представления presentation_blank_screen.
- presentation_blank_screen [Color String] // Цвет, который будет отображаться на экране (по умолчанию: черный). // Не реализован, а формат еще не определен.
Начиная с gsoc2013, эти команды распространяются на существующий протокол, поскольку на стороне сервера допустимы неизвестные команды, эти расширения не нарушают обратную совместимость
- pointer_started // создать красную точку на экране в начальной позиции (x,y) initial_x // Это следует вызывать, когда пользователь впервые касается экрана initial_y // заметить, что x, y выражены в процентах (от 0,0 до 1,0) по отношению к размер слайд-шоу
- pointer_dismissed // Это отклоняет красную точку указателя на экране, должна вызываться, когда пользователь перестает касаться экрана
- pointer_coordination // Это обновление позиции указателя на current (x,y) current_x // обратите внимание, что x, y выражены в процентах (от 0,0 до 1,0) по отношению к размеру слайд-шоу current_y //, если производительность screenupdater значительно не улучшена, мы должны рассмотреть ограничить частоту обновления на // удаленном конце
Состояние / Данные (сервер-клиент)
slideshow_finished // (Также передается, если при запуске слайд-шоу не запущено.)
slideshow_started // (Также передается, если при запуске запускается слайд-шоу.) numberOfSlides currentSlideNumber
slide_notes slideNumber [Notes] // Примечания являются HTML-документом и могут также включать \ n новые строки, // то есть клиент должен продолжать чтение, пока не будет достигнута пустая строка.
slide_updated // Слайд на сервере изменился currentSlideNumber
slide_preview // Предоставляет изображение предварительного просмотра для слайда. slideNumber image // A Base 64 Кодированное PNG-изображение.
Начиная с gsoc2013, эти команды распространяются на существующий протокол, поскольку удаленный конец также игнорирует все неизвестные команды (как в случае реализации gsoc2012 для Android), обратная совместимость сохраняется.
- slideshow_info // после сопряжения серверная часть отправит обратно заголовок текущей презентации Заголовок
Ответ от @user3159253 описывает, как подключиться к файлу презентации, который является первой частью вашего вопроса. Затем для управления презентацией вам понадобится XPresentation2 и XSlideShowController. Вот некоторый код, чтобы сделать это, используя doc
переменная из другого примера:
def runSlideShow(doc):
presentation = doc.getPresentation()
presentation.start()
while not presentation.isRunning():
pass
presentation_controller = presentation.getController()
presentation_controller.gotoNextSlide()
print("isRunning() == %s" % presentation_controller.isRunning())
Я адаптировал этот код с http://openoffice.2283327.n4.nabble.com/XPresentation2-returns-a-null-XSlideShowController-td2771599.html.
Отвечая на ваш комментарий: Вам нужно добавить следующее внизу кода, как в highlight.py. Вы пробовали запустить пример подсветки кода кода?
def do_runSlideShow(*args):
ctx = XSCRIPTCONTEXT
doc = ctx.getDocument()
runSlideShow(doc)
g_exportedScripts = (do_runSlideShow,)
if __name__ == "__main__":
doc = remote_get_doc()
runSlideShow(doc)
Посмотрите на AOO UNO. Вы также можете проверить некоторые проекты приложений, такие как docvert. Эта структура является общей для LO и Apache OO, но, возможно, существуют некоторые незначительные различия из-за раздельной разработки двух проектов.
Для простого учебного кода вы можете взглянуть на этот проект. Остальное зависит от ваших реальных потребностей, и вы должны изучить соответствующий API UNO, он (почти) не зависит от языка.