OpenOffice, scriptage en Python
Par Michel Billaud, mercredi 20 juin 2007 à 11:17 :: Bidouilles :: #8 :: rss
Mes premiers essais avec le scriptage d'OpenOffice en mode client serveur : un script client écrit en Python fait lire un document, le modifie et le sauve en PDF ainsi qu'en Word.
On lance une instance d'OpenOffice:
- Pour la mise au point des scripts, on démarre une instance d'OpenOffice en mode server sur un port quelconque (ici 2002) comme ceci :
soffice "-accept=socket,host=localhost,port=2002;urp;"
ce qui pemet de voir ce qui se passe. - Quand ça marche, on démarre l'instance dans un serveur X "virtual framebuffer" qui n'affiche rien.
xvfb-run -a soffice "-accept=socket,host=localhost,port=2002;urp;" -headless
Nota : Il faut d'abord installer python-uno. Le script a été écrit par couper-coller et récupération de petits bouts de gauche à droite, il y a probablement des choses inutiles du côté des "from" par exemple. Pour le tester, commencer par créer un petit document HTML dans /tmp/a.html.
# -*- coding: latin-1 -*- sourceFile = "/tmp/a.html" targetFilePrefix = "/tmp/sortie" import uno import unohelper import os.path # a UNO struct later needed to create a document from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK from com.sun.star.text.TextContentAnchorType import AS_CHARACTER from com.sun.star.awt import Size from com.sun.star.beans import PropertyValue # here we go localContext = uno.getComponentContext() resolver = localContext.ServiceManager.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver", localContext ) s = "uno:socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" smgr = resolver.resolve(s) remoteContext = smgr.getPropertyValue( "DefaultContext" ) desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop", remoteContext) # open a writer document sourceUrl = unohelper.systemPathToFileUrl(os.path.abspath(sourceFile)); sourceDoc = desktop.loadComponentFromURL( sourceUrl, "_blank", 0, () ) # play with it text = sourceDoc.Text cursor = text.createTextCursor() range = text.End range.String = "\n et hop une ligne à la fin\n" text.insertString( cursor, "\n et hop\nune ligne supplémentaire", 0) # export it as PDF properties = (PropertyValue('FilterName', 0, 'writer_pdf_Export', 0),) targetUrl = unohelper.systemPathToFileUrl(os.path.abspath( targetFilePrefix + ".pdf")) sourceDoc.storeToURL(targetUrl, properties) # export it as DOC properties = (PropertyValue('FilterName', 0, 'MS Word 95', 0),) targetUrl = unohelper.systemPathToFileUrl(os.path.abspath( targetFilePrefix + ".doc" )) sourceDoc.storeToURL(targetUrl, properties) # end it sourceDoc.close(True)(à suivre)
Commentaires
1. Le mercredi 20 juin 2007 à 14:15, par kolter
2. Le mardi 26 juin 2007 à 10:58, par l'auteur
3. Le mardi 26 juin 2007 à 19:40, par l'auteur
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.