Skip to content

Manipuler libreoffice en python

Auteur : Philippe Le Van - @plv@framapiaf.org

Date : 3 février 2023

Installation des outils de dev python pour libre office

En plus de libreoffice, installer les scripts python pour Libreoffice

Install the libreoffice-script-provider-python package

1
sudo apt install libreoffice-script-provider-python

Installer l'extension apso.

Cette extension permet de voir rapidement toutes les macros python.

On peut télécharger l'extension ici : https://extensions.libreoffice.org/en/extensions/show/apso-alternative-script-organizer-for-Python

Ensuite on peut installer l'extension dans Tools > Extension Manager > Add...

L'extension apso ajoute un nouveau menu : Tools > Macro > Organize Python Scripts > ...

Ma première macro python

Créer les répertoires pour les macros python

Sur mon ubuntu avec libreoffice, on peut mettre les scripts dans le répertoire suivant :

$HOME/.config/libreoffice/4/user/Scripts/python

Chez moi, j'ai du créer les répertoires Scripts/python

Créer un nouveau document HelloWorld.py

Le fichier est dans le répertoire est $HOME/.config/libreoffice/4/user/Scripts/python/HelloWorld.py

1
2
3
4
5
6
7
def HelloWorldPython( ):
    """Ecrit la chaîne 'Hello World (en Python)' dans le document actuel"""
    # Obtient le document à partir du contexte de script qui est mis à la disposition de tous les scripts
    model = XSCRIPTCONTEXT.getDocument()
    text = model.Text
    cursor = text.createTextCursor()
    text.insertString( cursor, "Hello World(en Python)", 0 )

Lancer la macro

Aller dans Tools > Macro > Organize Python Scripts

Faites un double clic sur la macro qui doit être présente :

Lancer une macro

Débugguer une macro python

Ouvrir le debugger

  • Aller dans Tools > Macro > Organize Python Scripts
  • Sélectionner la macro à débugguer
  • Cliquer sur Menu > Debug

On arrive sur un genre de débugger. On peut ouvrir une console en cliquant sur "console"

debugger python libreoffice

Ecrire sur la console

On peut utiliser la fonction print pour écrire sur la console.

Utiliser le débugger

On peut ensuite utiliser les boutons classiques du débugger, par exemple NEXT pour avancer pas à pas dans le code.

A chaque "print" du code, on verra s'afficher au fil de l'eau la valeur dans la console.

Documentation

Exemples de scripts en vrac

J'ai posé ici quelques exemples de code un peu "work in progress" mais qui permettent de voir comment marchent certaines fonctions de l'API.

Permet de fouiller dans des shapes du document

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from future import unicode_literals

import uno
import unohelper

def test():
    doc = XSCRIPTCONTEXT.getDocument()
    for page in doc.getDrawPages():

         for shape in page:
               if shape.getShapeType() == "com.sun.star.drawing.TextShape":

                      #shape.String = shape..String.replace(variable, value)
                 print(shape.getText)

Parcourir un document caractère par caractère dans des shapes

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
     for page in doc.getDrawPages():
            for shape in page:
                if shape.getShapeType() == "com.sun.star.drawing.TextShape":
                    #shape.String = shape..String.replace(variable, value)
                    cursor=shape.createTextCursor()
                    #on trouve avec string ou sont les variable puis dans
                    #le cas ou on a un variable $non positionné en 13
                    cursor.collapseToStart()
                    #attention je selectionne aprés le dollar
                    cursor.goRight(14,False)
                    cursor.goRight(3,True)
                    print("#####")
                    print(cursor.String)
                    shape.insertString(cursor,"aaaaaa",True)
                    print(cursor.String)
                    cursor.gotoStart(False)
                    #cursor.collapseToStart()
                    cursor.goRight(13,False)
                    cursor.goRight(1,True)
                    print(cursor.String)
                    cursor.String=""
                    print(cursor.String)
                    #print(shape.getText)

Système de copier-coller a priori non fonctionnel

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# coding: utf-8
from __future__ import unicode_literals
import uno
import os
import unohelper
from com.sun.star.datatransfer import XTransferable, DataFlavor
from com.sun.star.beans import PropertyValue

class Transferable(unohelper.Base, XTransferable):
    """Keep clipboard data and provide them."""

    def __init__(self, data,df):
        self.flavors = [df]
        self.data = [data] 

    def getTransferData(self, flavor):
        if not flavor: return
        mtype = flavor.MimeType
        for i,f in enumerate(self.flavors):
            if mtype == f.MimeType:
                return self.data[i]

    def getTransferDataFlavors(self):
        return tuple(self.flavors)

    def isDataFlavorSupported(self, flavor):
        if not flavor: return False
        mtype = flavor.MimeType
        for f in self.flavors:
            if mtype == f.MimeType:
                return True
        return False

def copy_oneFormat(format):
    oDoc = XSCRIPTCONTEXT.getDocument()
    df = None
    selectedContent = oDoc.CurrentController.getTransferable()
    dataFlavors = selectedContent.getTransferDataFlavors()
    for dataFlavor in dataFlavors:
        #print(dataFlavor.HumanPresentableName)
        if format in dataFlavor.HumanPresentableName.upper():
            df=dataFlavor
    if df is None:
        return None
    oData = selectedContent.getTransferData(df)
    transferable = Transferable(oData,df)
    #copie dans le presse-papier pour vérification
    ctx = XSCRIPTCONTEXT.getComponentContext()
    oClip = ctx.getServiceManager().createInstanceWithContext(
        "com.sun.star.datatransfer.clipboard.SystemClipboard", ctx)
    oClip.setContents(transferable, None)
    return transferable


def copy_rtf():
    copy_oneFormat("RICH TEXT")

def copy_png():
    copy_oneFormat("PNG")

def copy_html():
    copy_oneFormat("HTML")


# Functions that can be called from Tools -> Macros -> Run Macro.
g_exportedScripts = copy_rtf, copy_html, copy_png,