从 Python 控制 Libreoffice Impress
Control Libreoffice Impress from Python
我正在编写面向演讲者和会议的应用程序。我用 Python 编写它并专注于 Linux.
我想知道是否可以通过 Python 在 Linux 下以某种方式控制 LibreOffice Impress。
我想从我的 Python 应用程序启动一个加载了一些 .odp 文件的 LibreOffice Impress 实例。然后,我希望能够从 odp 接收一些信息,例如:上一张、当前和下一张幻灯片。或者以某种方式随时随地生成幻灯片的图像。
最后,我想实时控制LibreOffice。这是:使用方向键在幻灯片中移动;左右.
想法是单独使用python,但不介意使用外部库或框架。
非常感谢。
看看AOO UNO . You may also check some application projects like docvert。此框架为 LO 和 Apache OO 共享,但由于两个项目的独立开发,可能存在一些细微差异。
对于类似教程的简单代码,您可以查看 this project。剩下的就看你的实际需要了,你应该研究对应的UNOAPI,它(几乎)是语言中立的。
@user3159253 的回答描述了如何连接到演示文稿文件,这是您问题的第一部分。然后,要控制演示文稿,您将需要使用 XPresentation2 and 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 中的内容。
您是否尝试过 运行 impress-code-highlighter 示例?
def do_runSlideShow(*args):
ctx = XSCRIPTCONTEXT
doc = ctx.getDocument()
runSlideShow(doc)
g_exportedScripts = (do_runSlideShow,)
if __name__ == "__main__":
doc = remote_get_doc()
runSlideShow(doc)
最后,我找到了一种使用 Python 以优雅而简单的方式解决此问题的方法。我没有使用库或 API,而是使用套接字连接到 Impress 并控制它。
在 post 的末尾,您可以阅读 full-text 说明如何以这种方式控制 Impress。这很简单,也很神奇。
您使用 Python 向 Impress 发送一条消息(它正在监听某个端口),它会收到消息并根据您的请求执行操作。
您必须在应用中启用此 "remote control" 功能。我用这个解决了我的问题。
感谢您的回复!
LibreOffice Impress 远程协议规范
通过 UTF-8 编码的字符流进行通信。
(在 LibreOffice 部分使用 RTL_TEXTENCODING_UTF8。)
TCP
有关设置和初始握手的更多 TCP-specific 详细信息
已写,但实际消息协议与蓝牙相同。
消息格式
一条消息由一行或多行组成。第一行是消息描述,
更多的行可以添加任何必要的数据。空行结束消息。
即"MESSAGE\n\n" 或 "MESSAGE\nDATA\nDATA2...\n\n"
您必须继续阅读消息直到出现空行(即双
new-line) 已达到以允许未来的协议扩展。
初始化
连接后服务器发送"LO_SERVER_SERVER_PAIRED"。
(即 "LO_SERVER_SERVER_PAIRED\n\n" 通过流发送。)
随后服务器将发送 slideshow_started 如果幻灯片是 运行,
或者 slideshow_finished 如果没有幻灯片是 运行。 (详见下文。)
然后当前服务器实现继续发送所有幻灯片注释和预览
给客户。 (这应该被更改以防止内存问题,并且预览
已实施请求机制。)
命令(客户端到服务器)
客户端不应该假定服务器的状态在
命令已发送。所有更改都将发回给客户端。
(这是为了允许多个客户端请求不同更改等情况)
[方括号]中的任何行都是可选的,如果不需要则应省略。
- transition_next
transition_previous
goto_slide
slide_number
presentation_start
presentation_stop
presentation_resume // 在 presentation_blank_screen 之后恢复。
- presentation_blank_screen
[颜色字符串] // 屏幕将显示的颜色(默认值:黑色)。不是
// 已实现,格式尚未定义。
从 gsoc2013 开始,这些命令被扩展到现有协议,因为 server-end 可以容忍未知命令,这些扩展不会破坏向后兼容性
- pointer_started // 在屏幕初始位置 (x,y) 创建一个红点
initial_x // 这应该在用户第一次触摸屏幕时调用
initial_y // 请注意,x、y 是相对于幻灯片大小的百分比(从 0.0 到 1.0)
- pointer_dismissed // 这消除了屏幕上的指针红点,应该在用户停止触摸屏幕时调用
- pointer_coordination // 将指针的位置更新为当前 (x,y)
current_x // 请注意,x、y 是相对于幻灯片大小的百分比(从 0.0 到 1.0)
current_y //除非screenupdater的性能有明显提升,否则我们应该考虑限制更新频率
// remote-end
Status/Data(服务器到客户端)
slideshow_finished //(如果开始时没有幻灯片放映 运行,也会传输。)
slideshow_started //(如果幻灯片在启动时为 运行,也会传输。)
幻灯片数
当前幻灯片编号
slide_notes
幻灯片编号
[Notes] // 注释是一个 html 文档,也可能包含 \n 换行符,
// 即客户端应该继续阅读直到到达空白行。
slide_updated // 服务器上的幻灯片已更改
当前幻灯片编号
slide_preview // 为幻灯片提供预览图像。
幻灯片编号
image // Base 64 编码的 png 图像。
从 gsoc2013 开始,这些命令扩展到现有协议,因为 remote-end 也忽略所有未知命令(这是 gsoc2012 android 实现的情况),保持向后兼容性。
- slideshow_info // 配对后,server-end 将发回当前演示文稿的标题
标题
我正在编写面向演讲者和会议的应用程序。我用 Python 编写它并专注于 Linux.
我想知道是否可以通过 Python 在 Linux 下以某种方式控制 LibreOffice Impress。
我想从我的 Python 应用程序启动一个加载了一些 .odp 文件的 LibreOffice Impress 实例。然后,我希望能够从 odp 接收一些信息,例如:上一张、当前和下一张幻灯片。或者以某种方式随时随地生成幻灯片的图像。
最后,我想实时控制LibreOffice。这是:使用方向键在幻灯片中移动;左右.
想法是单独使用python,但不介意使用外部库或框架。
非常感谢。
看看AOO UNO . You may also check some application projects like docvert。此框架为 LO 和 Apache OO 共享,但由于两个项目的独立开发,可能存在一些细微差异。
对于类似教程的简单代码,您可以查看 this project。剩下的就看你的实际需要了,你应该研究对应的UNOAPI,它(几乎)是语言中立的。
@user3159253 的回答描述了如何连接到演示文稿文件,这是您问题的第一部分。然后,要控制演示文稿,您将需要使用 XPresentation2 and 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 中的内容。 您是否尝试过 运行 impress-code-highlighter 示例?
def do_runSlideShow(*args):
ctx = XSCRIPTCONTEXT
doc = ctx.getDocument()
runSlideShow(doc)
g_exportedScripts = (do_runSlideShow,)
if __name__ == "__main__":
doc = remote_get_doc()
runSlideShow(doc)
最后,我找到了一种使用 Python 以优雅而简单的方式解决此问题的方法。我没有使用库或 API,而是使用套接字连接到 Impress 并控制它。
在 post 的末尾,您可以阅读 full-text 说明如何以这种方式控制 Impress。这很简单,也很神奇。
您使用 Python 向 Impress 发送一条消息(它正在监听某个端口),它会收到消息并根据您的请求执行操作。
您必须在应用中启用此 "remote control" 功能。我用这个解决了我的问题。
感谢您的回复!
LibreOffice Impress 远程协议规范
通过 UTF-8 编码的字符流进行通信。 (在 LibreOffice 部分使用 RTL_TEXTENCODING_UTF8。)
TCP
有关设置和初始握手的更多 TCP-specific 详细信息 已写,但实际消息协议与蓝牙相同。
消息格式
一条消息由一行或多行组成。第一行是消息描述, 更多的行可以添加任何必要的数据。空行结束消息。
即"MESSAGE\n\n" 或 "MESSAGE\nDATA\nDATA2...\n\n"
您必须继续阅读消息直到出现空行(即双 new-line) 已达到以允许未来的协议扩展。
初始化
连接后服务器发送"LO_SERVER_SERVER_PAIRED"。 (即 "LO_SERVER_SERVER_PAIRED\n\n" 通过流发送。)
随后服务器将发送 slideshow_started 如果幻灯片是 运行, 或者 slideshow_finished 如果没有幻灯片是 运行。 (详见下文。)
然后当前服务器实现继续发送所有幻灯片注释和预览 给客户。 (这应该被更改以防止内存问题,并且预览 已实施请求机制。)
命令(客户端到服务器)
客户端不应该假定服务器的状态在 命令已发送。所有更改都将发回给客户端。 (这是为了允许多个客户端请求不同更改等情况)
[方括号]中的任何行都是可选的,如果不需要则应省略。
- transition_next
transition_previous
goto_slide slide_number
presentation_start
presentation_stop
presentation_resume // 在 presentation_blank_screen 之后恢复。
- presentation_blank_screen [颜色字符串] // 屏幕将显示的颜色(默认值:黑色)。不是 // 已实现,格式尚未定义。
从 gsoc2013 开始,这些命令被扩展到现有协议,因为 server-end 可以容忍未知命令,这些扩展不会破坏向后兼容性
- pointer_started // 在屏幕初始位置 (x,y) 创建一个红点 initial_x // 这应该在用户第一次触摸屏幕时调用 initial_y // 请注意,x、y 是相对于幻灯片大小的百分比(从 0.0 到 1.0)
- pointer_dismissed // 这消除了屏幕上的指针红点,应该在用户停止触摸屏幕时调用
- pointer_coordination // 将指针的位置更新为当前 (x,y) current_x // 请注意,x、y 是相对于幻灯片大小的百分比(从 0.0 到 1.0) current_y //除非screenupdater的性能有明显提升,否则我们应该考虑限制更新频率 // remote-end
Status/Data(服务器到客户端)
slideshow_finished //(如果开始时没有幻灯片放映 运行,也会传输。)
slideshow_started //(如果幻灯片在启动时为 运行,也会传输。) 幻灯片数 当前幻灯片编号
slide_notes 幻灯片编号 [Notes] // 注释是一个 html 文档,也可能包含 \n 换行符, // 即客户端应该继续阅读直到到达空白行。
slide_updated // 服务器上的幻灯片已更改 当前幻灯片编号
slide_preview // 为幻灯片提供预览图像。 幻灯片编号 image // Base 64 编码的 png 图像。
从 gsoc2013 开始,这些命令扩展到现有协议,因为 remote-end 也忽略所有未知命令(这是 gsoc2012 android 实现的情况),保持向后兼容性。
- slideshow_info // 配对后,server-end 将发回当前演示文稿的标题 标题