Exploitez LibreOffice avec Python

Version utilisée

Aperçu

Pour utiliser LibreOffice avec Python

  1. Lancez une macro Python à partir de l'interface graphique de LibreOffice.
  2. Démarrez la macro Python spécifiée par le paramètre lors du démarrage de LibreOffice à partir de la ligne de commande.
  3. Lancez un programme Python à partir de la ligne de commande et connectez-vous au LibreOffice lancé.

Il existe trois méthodes.

La première méthode nécessite une opération GUI, de sorte que le traitement par lots à partir du programme ne peut pas être effectué. L'opérateur répond à toute erreur.

La deuxième méthode peut être utilisée pour le traitement par lots car LibreOffice sera arrêté une fois la macro terminée. Lorsqu'une erreur se produit, LibreOffice affichera une boîte de dialogue et attendra, et le programme ne pourra pas la gérer. Compte tenu des erreurs possibles, il est nécessaire de prendre des mesures telles que fixer une limite de temps dans timeout-decorator. De plus, s'il y a un LibreOffice qui a déjà été démarré au démarrage de LibreOffice, le traitement y sera effectué, il peut donc ne pas être possible de contrôler comme prévu.

La troisième méthode consiste à spécifier à l'avance le commutateur --accept vers LibreOffice afin qu'il puisse être connecté avec un socket ou un tube nommé et le démarrer. Avec cette méthode, si LibreOffice est démarré en premier, le traitement y sera effectué, il peut donc ne pas être possible de contrôler comme prévu. Il peut être utilisé sur Microsoft Windows, mais il ne peut pas être exécuté sur FreeBSD en raison d'une erreur lors de la connexion.

Système de traitement Python

Microsoft Windows

Sous Microsoft Windows, LibreOffice est livré avec un processeur Python% PROGRAMFILES% \ LibreOffice \ program \ python.exe, qui est automatiquement utilisé pour les macros. Même lors de la connexion depuis la ligne de commande, il est nécessaire d'utiliser le système de traitement Python fourni avec LibreOffice. La version Python fournie avec LibreOffice 6.3.6 est la 3.5.9.

La bibliothèque est installée dans% PROGRAMFILES% \ LibreOffice \ program \ python-core-3.5.9 \ lib. Il existe également un sous-dossier site-packages, qui passe également par sys.path, mais ne contient qu'un fichier README. L'installation du package n'est pas facile car il n'y a pas de pip. Depuis Installation de site pip Vous pouvez l'installer en téléchargeant et en exécutant get-pip.py, mais si vous l'exécutez avec des privilèges de compte personnel % PROGRAMFILES% \ LibreOffice \ program \ python-core-3.5.9 \ lib \ site-packages n'est pas accessible en écriture Il est installé dans% APPDATA% \ Roaming \ Python \ Python35 \ site-packages sous le profil de l'utilisateur.

C:\Users\shota243>cd Downloads
C:\Users\shota243\Downloads>"c:\Program Files\LibreOffice\program"\python get-pip.py
Defaulting to user installation because normal site-packages is not writeable
Collecting pip
  Downloading pip-20.1.1-py2.py3-none-any.whl (1.5 MB)
     |################################| 1.5 MB 1.3 MB/s
Collecting setuptools
  Downloading setuptools-47.1.1-py3-none-any.whl (583 kB)
     |################################| 583 kB 6.8 MB/s
Collecting wheel
  Downloading wheel-0.34.2-py2.py3-none-any.whl (26 kB)
Installing collected packages: pip, setuptools, wheel
  WARNING: The scripts pip.exe, pip3.5.exe and pip3.exe are installed in 'C:\Users\shota243\AppData\Roaming\Python\Python35\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts easy_install-3.5.exe and easy_install.exe are installed in 'C:\Users\shota243\AppData\Roaming\Python\Python35\Scripts' which is not on PATH.

  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script wheel.exe is installed in 'C:\Users\shota243\AppData\Roaming\Python\Python35\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-20.1.1 setuptools-47.1.1 wheel-0.34.2

pip.exe est également installé dans% APPDATA% \ Roaming \ Python \ Python35 \ Scripts, mais vous devez le configurer vous-même pour mettre ce dossier dans votre PATH et% PROGRAMFILES% pour exécuter pip.exe Étant donné que \ LibreOffice \ program \ python35.dll est requis, il est également nécessaire de traiter le chemin de recherche de la DLL.

%PROGRAMFILES%\LibreOffice\program\python -m pip

Il peut être plus facile de commencer. Les packages installés avec pip sont également installés dans% APPDATA% \ Roaming \ Python \ Python35 \ site-packages, mais ils peuvent être utilisés tels quels car sys.path est disponible.

C:\Users\shota243>"c:\Program Files\LibreOffice\program"\python -m pip install timeout-decorator
Defaulting to user installation because normal site-packages is not writeable
Collecting timeout-decorator
  Downloading timeout-decorator-0.4.1.tar.gz (4.8 kB)
Building wheels for collected packages: timeout-decorator
  Building wheel for timeout-decorator (setup.py) ... done
  Created wheel for timeout-decorator: filename=timeout_decorator-0.4.1-py3-none-any.whl size=5022 sha256=5d3ecc37c619ed429c313b18ddf3b01b309d43dccc65d19ce974df
76af478609
  Stored in directory: c:\users\shota243\appdata\local\pip\cache\wheels\df\f4\3c\031226c90008861114781e36ef5898934aad3196808c40e6ea
Successfully built timeout-decorator
Installing collected packages: timeout-decorator
Successfully installed timeout-decorator-0.4.1

Si vous exécutez get-pip.py avec des privilèges d'administrateur, vous pouvez installer pip dans un dossier sous% PROGRAMFILES% et le partager sur votre système. D'autres packages peuvent également être installés sous% PROGRAMFILES%. Cependant, le dossier% PROGRAMFILES% \ LibreOffice peut être supprimé lors de la mise à jour de LibreOffice et peut devoir être traité.

FreeBSD

Dans le cas de FreeBSD, LibreOffice n'est pas livré avec un système de traitement Python, et même s'il s'agit d'une macro, Python qui est dans le PATH est utilisé. Les packages installés avec pip peuvent également être utilisés à partir de macros. Si vous démarrez LibreOffice dans un environnement virtuel, vous pouvez utiliser différentes versions et packages de Python.

UNO

Utilisez UNO (Universal Network Objects) pour faire fonctionner LibreOffice par programmation. UNO est un modèle de composant indépendant du langage qui utilise le pont Python-UNO (PyUNO-bridge) lorsqu'il est utilisé à partir de Python. .. Utilisez également le pont Python-UNO, que ce soit à partir d'une macro ou d'une connexion externe.

Macro Python

Placement des macros Python

LibreOffice n'a ni la capacité d'éditer les macros Python ni la capacité de lancer des éditeurs. Créez une macro Python séparément et placez-la dans le répertoire suivant.

Pour Microsoft Windows

%APPDATA%\LibreOffice\4\user\Scripts\python
%PROGRAMFILES%\LibreOffice\share\Scripts\python

Pour les systèmes de type FreeBSD ou UNIX

${HOME}/.config/libreoffice/4/user/Scripts/python
/usr/local/lib/libreoffice/share/Scripts/python

Le répertoire de placement des macros utilisateur n'existe pas depuis le début, créez-le vous-même si nécessaire.

APSO --Alternative Script Organizer for Python Extension

APSO --Alternative Script Organizer for Python Après avoir installé l'extension, vous pouvez:

Cela permet de modifier sans être conscient de la disposition de la macro. Vous pouvez également essayer d'accéder à UNO à partir de l'interpréteur Python.

Variable globale XSCRIPTCONTEXT

Les variables globales XSCRIPTCONTEXT peuvent être référencées à partir de macros Python. À partir de XSCRIPTCONTEXT, vous pouvez accéder à l'environnement dans lequel la macro est démarrée par la méthode suivante.

XSCRIPTCONTEXT est une implémentation de l'interface XScriptContext, En tant que variable globale de Python, il s'agit d'une instance de la classe pythonscript.ScriptContext.

>>> type(XSCRIPTCONTEXT)
<class 'pythonscript.ScriptContext'>

Les définitions de classe se trouvent dans le fichier /usr/local/lib/libreoffice/program/pythonscript.py.

Appel de macros depuis la ligne de commande

La ligne de commande pour spécifier la macro au démarrage de LibreOffice est la suivante

soffice 'vnd.sun.star.script:<Nom du fichier de script>$<Nom de la fonction>?language=Python&location=user'

Cela exécutera la macro et quittera LibreOffice. Si la macro n'a pas besoin d'afficher l'écran, activez le commutateur --headless et l'écran ne s'affichera pas. Si une erreur se produit pendant l'exécution de la macro, une boîte de dialogue d'erreur s'affiche pour demander la confirmation de l'utilisateur, mais si --headless est spécifié, la boîte de dialogue ne s'affiche pas et un blocage se produit.

Exemple:

mymacro.py


def macrofunc():
    pass

Pour démarrer sans affichage d'écran

$ soffice --headless 'vnd.sun.star.script:mymacro.py$macrofunc?language=Python&location=user'

Connexion depuis Python lancée depuis la ligne de commande

Lancez LibreOffice

Pour recevoir une connexion externe, spécifiez à l'avance le commutateur --accept vers LibreOffice et démarrez-le. Pour connexion par prise

$ soffice  "--accept=socket,host=<Désignation de l'hôte>,port=<numéro de port>;urp;"

Pour une connexion de tuyau nommée

$ soffice "--accept=pipe,name=<Nom du canal nommé>;urp;"

Dans les deux cas, le shell du système d'exploitation UNIX traite un point-virgule (;) comme un délimiteur de commande, il doit donc être entre guillemets.

Exemple:

$ soffice --writer "--accept=socket,host=0,port=2002;urp;"
$ soffice --calc --headless "--accept=pipe,name=librepipe;urp;"

Pont Python-UNO Dans la page d'exemple

"-accept=socket,host=localhost,port=2002;urp;"

Il y a un signe moins avant "accepter", qui est l'ancienne notation et la notation actuelle consiste à en écrire deux. De plus, dans le même exemple, le programme insère la chaîne de caractères "Hello, World" dans le document Writer, mais comme le document n'est pas nouvellement créé dans le programme, s'il est exécuté tel quel, une erreur se produira lors de l'accès à la propriété text. Si vous en créez un nouveau avec le commutateur --writer lorsque vous démarrez LibreOffice, ce document sera utilisé.

Connexion depuis le programme Python

Dans le programme Python, le paramètre du commutateur d'option --accept au démarrage de LibreOffice est spécifié lorsque le résolveur (instance com.sun.star.bridge.UnoUrlResolver) résout la destination de la connexion du côté connectant la même chaîne de caractères. Étant donné que l'hôte est le nom d'hôte du partenaire, différentes valeurs seront spécifiées.

Une fois que vous vous êtes connecté à LibreOffice et que vous avez obtenu le contexte, vous pouvez l'utiliser pour créer une instance Desktop et une instance de la classe ScriptContext pour remplacer la variable globale XSCRIPTCONTEXT dans votre macro. Le troisième argument du constructeur de classe ScriptContext est le contexte d'appel, mais il peut être NULL selon la documentation de l'interface XScriptContext (https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1script_1_1provider_1_1XScriptContext.html). Spécifiez Aucun.

import uno
from pythonscript import ScriptContext

def connect_script_context(host='localhost', port='2002', namedpipe=None):
    UNO_RESOLVER = "com.sun.star.bridge.UnoUrlResolver"
    UNO_DESKTOP = "com.sun.star.frame.Desktop"
    localCtx = uno.getComponentContext()
    localSmgr = localCtx.ServiceManager
    resolver = localSmgr.createInstanceWithContext(UNO_RESOLVER, localCtx)
    if namedpipe is None:
        uno_string = 'uno:socket,host=%s,port=%s;urp;StarOffice.ComponentContext' % (host, port)
    else:
        uno_string = 'uno:pipe,name=%s;urp;StarOffice.ComponentContext' % namedpipe
    ctx = resolver.resolve(uno_string)
    smgr = ctx.ServiceManager
    XSCRIPTCONTEXT = ScriptContext(ctx,
                                   smgr.createInstanceWithContext(UNO_DESKTOP, ctx),
                                   None)
    return XSCRIPTCONTEXT

Simulez le cas de la macro en affectant la valeur de retour de cette fonction connect_script_context () à la variable globale XSCRIPTCONTEXT.

Paramètres et erreurs pour FreeBSD

Lors de la connexion à LibreOffice depuis FreeBSD ou un système de type UNIX, le programme Python sous / usr / local / lib / libreoffice / program est importé et la bibliothèque de liens dynamiques au même emplacement est également utilisée, donc LD_LIBRARY_PATH est utilisé en plus de PYTHONPATH. Transmettez également les variables d'environnement.

export PYTHONPATH="${PYTHONPATH}:/usr/local/lib/libreoffice/program"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/local/lib/libreoffice/program"
export PATH="${PATH}:/usr/local/lib/libreoffice/program"

Lorsque je me connecte, je peux me connecter et obtenir le ComponentContext, mais j'obtiens une erreur lorsque j'essaie d'obtenir Desktop.

>>> import uno
import uno
>>> localContext = uno.getComponentContext()
localContext = uno.getComponentContext()
>>> resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
<reateInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
>>> ctx = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
ctx = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
>>> smgr = ctx.ServiceManager
smgr = ctx.ServiceManager
>>> desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop",ctx)
desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop",ctx)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.RuntimeException: Binary URP bridge disposed during call

Recommended Posts

Exploitez LibreOffice avec Python
Travailler avec LibreOffice en Python: import
Gérer les sons en Python
Travailler avec des images DICOM en Python
Essayez de travailler avec des données binaires en Python
Essayez de travailler avec Mongo en Python sur Mac
[Introduction pour les débutants] Manipuler MySQL avec Python
Grattage au sélénium en Python
Grattage avec chromedriver en python
Débogage avec pdb en Python
Python: travailler avec Firefox avec du sélénium
Grattage avec du sélénium en Python
Grattage avec Tor en Python
Tweet avec image en Python
Combiné avec ordinal en Python
Exemple de code spécifique pour travailler avec SQLite3 en Python
Reconnaissance des nombres dans les images avec Python
Tester avec des nombres aléatoires en Python
GOTO en Python avec Sublime Text 3
Scraping avec Selenium en Python (Basic)
Analyse CSS avec cssutils en Python
Numer0n avec des objets fabriqués avec Python
Ouvrez UTF-8 avec BOM en Python
Utiliser rospy avec virtualenv dans Python3
Utiliser Python mis en pyenv avec NeoVim
Heatmap avec dendrogramme en Python + matplotlib
Lire des fichiers en parallèle avec Python
Générer un mot de passe pour le manuel avec python
Utiliser OpenCV avec Python 3 dans Window
Jusqu'à traiter de python dans Atom
Démarrez avec Python avec Blender
Quadtree en Python --2
Python en optimisation
CURL en Python
FizzBuzz en Python3
Métaprogrammation avec Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Grattage avec Python
Essayez de vous connecter à qiita avec Python
Test de stress avec Locust écrit en Python
Python3> dans le mot clé> Vrai avec une correspondance partielle?
Statistiques avec python
Surveillance des appareils effectuée par Python On-box de IOS-XE
Méta-analyse en Python
Unittest en Python
Grattage avec Python
Python avec Go
Dessinez Nozomi Sasaki dans Excel avec python
Conseils pour gérer les binaires en Python
Afficher Python 3 dans le navigateur avec MAMP
Twilio avec Python
Époque en Python
Discord en Python
Intégrer avec Python
Comment utiliser BigQuery en Python
Classe Trump en Python (avec comparaison)