【问题标题】:How to select a textbox in LibreOffice Impress and change it's font size using Python?如何在 LibreOffice Impress 中选择文本框并使用 Python 更改其字体大小?
【发布时间】:2020-08-20 21:10:09
【问题描述】:

我是使用 Python 和 LibreOffice 套件的新手。我基本上是在尝试以编程方式复制基本 Impress 文件并批量复制它,但会更改某些文本框的大小。

我在网上查看了一些关于此的文档,但对如何实际实现它感到困惑。

谢谢

编辑: 我写了这个测试代码

import os
import zipfile
import glob
import uno

def MassCreatePresentation():

    file = os.path.abspath(glob.glob('INTROTEMPLATE.pptx')[0])
    print('File Found')
    print(file)
    oDoc = XSCRIPTCONTEXT.getDocument()

    return

但它显示了这个错误:

File "MassPresentation.py", line 10, in MassCreatePresentation
    oDoc = XSCRIPTCONTEXT.getDocument()
NameError: name 'XSCRIPTCONTEXT' is not defined

编辑:

好的,我终于用这个逻辑解决了这个问题。我的做法:

1)让shutil复制基础文件 2)使用zipfile解压复制的pptx文件, 3) 导航到幻灯片 xml 并使用 readlines() 4)修改xml并保存 5) 归档为 zip,然后将文件重命名为 .pptx 6)庆祝

【问题讨论】:

标签: python libreoffice-impress


【解决方案1】:

由于 Impress 中的macro recording does not seem possible,您可能还有其他方法可以尝试。

LibreOffice 文件基本上只是包含 xml 或图像文件的 zip 文件。

如果你解压 odp 文件,里面有一个content.xml

您可以使用 ElementTree 或 lxml 处理此文件并更改您需要的字段。字体设置也在其中。

<?xml version="1.0" encoding="UTF-8"?>
  ....
  <draw:text-box><text:list text:style-name="L1">
    <text:list-item>
      <text:p>CHANGE TEXT HERE</text:p>
    </text:list-item></text:list>
  </draw:text-box>
  ....
  <style:text-properties fo:font-family="StarSymbol" fo:color="#666666" fo:font-size="45%"/>

我找不到一个好的文档,哪些方法可以使用宏 iterface。它可能更优雅,但事实证明这样做可以在一两个小时内工作:

  • 解压
  • 用 ElementTree 打开
  • 改变
  • 保存文件
  • 重新压缩并更新旧的

This page 显示了一些用于处理 zip 和 LibreOffice 文件的代码。还有this one

充其量将content.xml 的内容通过this 之类的在线格式化程序。所以可以很好地了解它的结构。

您可以直接指定字体或使用定义的样式之一。

这是L1的定义:

<text:list-style style:name="L1">

&lt;office:automatic-styles&gt;

这是该 stype 的用法:

<text:list text:style-name="L1">

关于 Impress 宏的信息和示例非常少,其中大部分都在 BASIC 中:

【讨论】:

  • 这实际上是一种非常有趣的方法。我基本上可以做到这一点,而无需在我的虚拟环境中安装太多。实际上,我还在 .pptx 文件上检查了这一点,逻辑相同,只是它们由文件分隔。如果效果足够好,我最终可能会选择 .pptx 路线而不是 LibreOffice。我还想试试 Jim K 的回答。谢谢你,我会回来报告
  • 我试过这个,但奇怪的是,当我解压缩 pptx 文件并修改 xml 文件然后重新压缩它时显示为损坏的文件并且不再打开
  • 最好不要提取整个文件,只提取包含内容的文件。然后将其重新合并。您可以将单个文件添加到 zip (pptx) 并更新它。
【解决方案2】:

此代码更改标准(“西方”)字体的字体大小。

def resize_text_box():
    oDoc = XSCRIPTCONTEXT.getDocument()
    oDrawPage = oDoc.getDrawPages().getByIndex(0)
    for oShape in oDrawPage:
        if oShape.supportsService("com.sun.star.drawing.TextShape"):
            oShape.CharHeight = 18

相关:https://stackoverflow.com/a/59934440/5100564

【讨论】:

  • 我会尝试这个和其他答案并报告回来,如果不是答案,这似乎很有希望
  • 我还需要导入哪些模块才能使其正常工作?导入 uno?
  • 看来import uno 对于这段代码的工作来说不是必需的,但无论如何导入它并没有什么坏处。导入成功表明 python-uno 正在工作,如果出现问题,这有助于弄清楚发生了什么。
  • 我尝试了以下代码 oDoc = XSCRIPTCONTEXT.getDocument() 但它不起作用,它显示为错误:文件“MassPresentation.py”,第 11 行,在 MassCreatePresentation oDoc = XSCRIPTCONTEXT.getDocument() NameError: 名称“XSCRIPTCONTEXT”未定义
  • 使用APSO 创建和执行脚本。也可以试试this tutorialTransfer from Basic to Python
猜你喜欢
  • 2023-04-10
  • 2017-08-04
  • 2022-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多