Pour utiliser LibreOffice avec Python
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.
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.
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.
%APPDATA%\LibreOffice\4\user\Scripts\python
%PROGRAMFILES%\LibreOffice\share\Scripts\python
${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 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.
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.
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'
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é.
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.
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