【问题标题】:Control Libreoffice Impress from Python从 Python 控制 Libreoffice Impress
【发布时间】:2015-10-13 00:46:57
【问题描述】:

我正在编写一个面向演讲者和会议的应用程序。我用 Python 编写它并专注于 Linux。

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

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

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

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

非常感谢。

【问题讨论】:

    标签: python libreoffice


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了!。是否有关于 Impress 的 Python 示例或文档?谢谢。
    • @jrodriguesmonti - 还可以查看 Andrew Pitonyak 的 OpenOffice Macros Explained 一书。它可以从他的网站pitonyak.org/oo.php 免费下载,并且有一章是关于 Impress 的。这些示例在 OpenOffice Basic 中,因此您需要从他的示例中获取 API 名称并将其余代码转换为 Python。
    【解决方案2】:

    @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)
    

    【讨论】:

    • 谢谢,伙计们!这就是我一直在寻找的。 ¿ 你有完整的代码吗?我想读它,我对这个话题还不是很满意。谢谢!
    【解决方案3】:

    最后,我找到了一种使用 Python 以一种优雅且简单的方式解决此问题的方法。我没有使用库或 API,而是使用套接字连接到 Impress 并对其进行控制。

    在文章的末尾,您可以阅读全文,说明如何以这种方式控制 Impress。这很简单,而且很棒。

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

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

    感谢您的回复!

    LibreOffice Impress 远程协议规范

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

    TCP

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

    消息格式

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

    即"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 幻灯片编号

    • presentation_start

    • presentation_stop

    • presentation_resume // 在presentation_blank_screen 之后恢复。

    • presentation_blank_screen [颜色字符串] // 屏幕将显示的颜色(默认值:黑色)。不是 // 已实现,格式尚未定义。

    从 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的性能有明显提升,否则我们应该考虑限制更新频率 // 远程端

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

    • slideshow_finished //(如果启动时没有幻灯片运行,也会传输。)

    • slideshow_started //(如果幻灯片在启动时运行,也会传输。) 幻灯片数 当前幻灯片编号

    • slide_notes 幻灯片编号 [Notes] // 注释是一个 html 文档,可能还包含 \n 换行符, // 即客户端应该一直读到空行为止。

    • slide_updated // 服务器上的幻灯片已更改 当前幻灯片编号

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

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

    • slideshow_info //一旦配对,服务器端将返回当前演示的标题 标题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2015-05-16
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多