从Python控制Libreoffice Impress

时间:2015-10-13 00:46:57

标签: python libreoffice

我正在编写面向发言人和会议的应用程序。我用Python编写它并专注于Linux。

我想知道是否有可能以某种方式在Linux下用Python控制LibreOffice Impress。

我想从我的Python应用程序启动一个带有一些.odp文件的LibreOffice Impress实例。然后,我希望能够从odp接收一些信息,例如:上一张,当前一张和下一张幻灯片。或者以某种方式在旅途中生成幻灯片的图像。

最后,我想实时控制LibreOffice。这是:使用方向键移动幻灯片;左右。

这个想法是单独使用python,但我不介意使用外部库或框架。

非常感谢。

3 个答案:

答案 0 :(得分:0)

看看AOO UNO。您还可以检查一些应用程序项目,例如docvert。这个框架在LO和Apache OO之间共享,但由于两个项目的单独开发,可能会有一些细微的差别。

对于类似教程的简单代码,您可以查看this project。其余的取决于您的实际需求,您应该学习相应的UNO API,它(几乎)与语言无关。

答案 1 :(得分:0)

来自@ user3159253的答案描述了如何连接到演示文稿文件,这是您问题的第一部分。然后,要控制演示文稿,您需要使用XPresentation2XSlideShowController。以下是使用其他示例中的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)

答案 2 :(得分:0)

最后,我找到了一种使用Python以优雅和简单的方式解决这个问题的方法。我使用套接字连接到Impress并控制它,而不是库或API。

在帖子的最后,您可以阅读指示如何以这种方式控制Impress的全文。这很简单,也很棒。

您使用Python向Impress发送消息(即在某个端口侦听),它会根据您的请求接收消息并执行操作。

您必须在应用中启用此“遥控”功能。我用这个解决了我的问题。

感谢您的回复!

LibreOffice Impress远程协议规范

通信是通过UTF-8编码的字符流。 (在LibreOffice部分中使用RTL_TEXTENCODING_UTF8。)

TCP

有关设置和初始握手的更多特定于TCP的详细信息 写的,但实际的消息协议与蓝牙相同。

邮件格式

消息由一行或多行组成。第一行是消息描述, 更多行可以添加任何必要的数据。空行结束消息。

即。 “MESSAGE \ n \ n”或“MESSAGE \ nDATA \ nDATA2 ... \ n \ n”

你必须继续阅读消息,直到空行(即双倍​​) 到达新线)以允许将来的协议扩展。

Intialisation

连接后,服务器发送“LO_SERVER_SERVER_PAIRED”。 (即,通过流发送“LO_SERVER_SERVER_PAIRED \ n \ n”。)

随后,如果幻灯片正在运行,服务器将发送slideshow_started, 如果没有幻灯片正在运行,则幻灯片放映完成。 (详见下文。)

然后,当前服务器实现将继续发送所有幻灯片备注和预览 给客户。 (这应该更改以防止内存问题和预览 请求机制已实施。)

命令(客户端到服务器)

当a时,客户端不应该假设服务器的状态已经改变 命令已发送。所有更改都将发回给客户。 (这是为了允许多个客户请求不同的更改等情况。)

[方括号]中的任何行都是可选的,如果不需要,则应省略。

  • 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 //此更新指针的位置为当前(x,y) current_x //请注意,x,y相对于幻灯片大小的百分比(从0.0到1.0) current_y //除非screenupdater的性能得到显着提高,否则我们应该考虑限制更新频率                         // remote-end

状态/数据(服务器到客户端)

  • slideshow_finished //(如果启动时未播放幻灯片,也会传输。)

  • slideshow_started //(如果幻灯片正在启动时运行,也会传输。) numberOfSlides currentSlideNumber

  • slide_notes slideNumber [注意] //注释是一个html文档,也可能包含\ n换行符,                     //即客户应继续阅读,直至到达空行。

  • slide_updated //幻灯片服务器已更改 currentSlideNumber

  • slide_preview //提供幻灯片的预览图像。 slideNumber image // A Base 64编码的png图像。

从gsoc2013开始,这些命令扩展到现有协议,因为远端也忽略了所有未知命令(这是gsoc2012 android实现的情况),保持向后兼容性。

  • slideshow_info //配对后,服务器端将发回当前演示文稿的标题 标题