2016-09-02 1 views
1

J'utilise Java et l'API LibreOffice, et je voudrais dessiner des rectangles et définir leurs noms, ou leur mettre des champs de texte. Dessiner des formes était relativement facile, mais ajouter du texte est vraiment difficile. Je n'ai trouvé aucune solution, ni dans la documentation ni sur les forums.Java LibreOffice Draw - Définir le texte d'une forme

Je déclare la forme et le texte comme celui-ci:

Object drawShape = xDrawFactory.createInstance("com.sun.star.drawing.RectangleShape"); 
XShape xDrawShape = UnoRuntime.queryInterface(XShape.class, drawShape); 
xDrawShape.setSize(new Size(10000, 20000)); 
xDrawShape.setPosition(new Point(5000, 5000)); 
xDrawPage.add(xDrawShape); 

XText xShapeText = UnoRuntime.queryInterface(XText.class, drawShape); 
XPropertySet xShapeProps = UnoRuntime.queryInterface(XPropertySet.class, drawShape); 

Et puis je suis en train de mettre XText:

xShapeText.setString("ABC"); 

Et c'est là le problème apparaît (cette exception n'est pas clair pour moi même après avoir lu l'explication de la documentation):

com.sun.star.lang.DisposedException à com.sun.star.lib.uno.environments.remote.JobQueue.removeJob (JobQueue.java:210) à com.sun.star.lib.uno.environments.remote.JobQueue.enter (JobQueue.java: 330) à l'adresse com.sun.star.lib.uno.environments.remote.JobQueue.enter (JobQueue.java:303) à l'adresse com.sun.star.lib.uno.environments.remote.JavaThreadPool.enter (JavaThreadPool. java: 87) à com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge.sendRequest (java_remote_bridge.java:636) à com.sun.star.lib.uno.bridges.java_remote.ProxyFactory $ Handler. request (ProxyFactory.java:146) à com.sun.star.lib.uno.bridges.java_remote.ProxyFactory $ Handler.invoke (ProxyFactory.java:128) à com.sun.proxy. $ Proxy6.setString (Inconnu Source) à com.ericsson.stpdiagramgenerator.presentation.core.Hello TextTableShape.manipulateText (HelloTextTableShape.java:265) à com.ericsson.stpdiagramgenerator.presentation.core.HelloTextTableShape.useWriter (HelloTextTableShape.java:65) à com.ericsson.stpdiagramgenerator.presentation.core.HelloTextTableShape.useDocuments (HelloTextTableShape. java: 52) à com.ericsson.stpdiagramgenerator.presentation.core.HelloTextTableShape.main (HelloTextTableShape.java:42) à sun.reflect.NativeMethodAccessorImpl.invoke0 (Méthode natif) à sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl .java: 62) à sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) à java.lang.reflect.Method.invoke (Method.java:498) à com.intellij.rt.execution.application .AppMain.main (AppMain.java:147) Causé par: java.io.IOException: com.sun.star.io.IOException: EOF atteint - socket, hôte = localhost, port = 8100, localHost = localhost.localdomain, localPort = 34456, pairHost = localhost, PeerPort = 8100 à com.sun.star.lib.uno.bridges.java_remote.XConnectionInputStream_Adapter.read (XConnectionInputStream_Adapter.java:55) à java.io.DataInputStream.readInt (DataInputStream.java:387) à com.sun.star.lib.uno.protocols.urp.urp.readBlock (urp.java:355) à com.sun.star.lib.uno.protocols.urp.urp.readMessage (urp.java:92) à com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge $ MessageDispatcher.run (java_remote_bridge.java:105)

Peut-être avez-vous une autre solution pour insérer text/textbox/textfield sur une forme avec l'API LibreOffice.

+0

Bonjour et bienvenue sur StackOverflow! Essayez d'éviter les déclarations comme "J'ai un gros problème". Au lieu de cela, expliquez simplement ce qu'est le problème. Autre que cela, c'est une question bien écrite. Un lien vers la documentation peut également aider, bien que dans ce cas, j'ai pu trouver facilement les liens pertinents de l'API UNO. –

Répondre

0

Votre code fonctionne correctement sur ma machine. Je l'ai testé dans LibreOffice 5.1.0.3 sous Windows.Voici le code je:

com.sun.star.frame.XDesktop xDesktop = null; 
// getDesktop() is from 
// https://wiki.openoffice.org/wiki/API/Samples/Java/Writer/BookmarkInsertion 
xDesktop = getDesktop(); 
com.sun.star.lang.XComponent xComponent = null; 
try { 
    xComponent = xDesktop.getCurrentComponent(); 
    XDrawPagesSupplier xDrawPagesSupplier = 
     (XDrawPagesSupplier)UnoRuntime.queryInterface(
      XDrawPagesSupplier.class, xComponent); 
    Object drawPages = xDrawPagesSupplier.getDrawPages(); 
    XIndexAccess xIndexedDrawPages = (XIndexAccess) 
     UnoRuntime.queryInterface(
     XIndexAccess.class, drawPages); 
    Object drawPage = xIndexedDrawPages.getByIndex(0); 
    XMultiServiceFactory xDrawFactory = 
     (XMultiServiceFactory)UnoRuntime.queryInterface(
      XMultiServiceFactory.class, xComponent); 
    Object drawShape = xDrawFactory.createInstance(
     "com.sun.star.drawing.RectangleShape"); 
    XDrawPage xDrawPage = (XDrawPage)UnoRuntime.queryInterface(
     XDrawPage.class, drawPage); 
    XShape xDrawShape = UnoRuntime.queryInterface(XShape.class, drawShape); 
    xDrawShape.setSize(new Size(10000, 20000)); 
    xDrawShape.setPosition(new Point(5000, 5000)); 
    xDrawPage.add(xDrawShape); 

    XText xShapeText = UnoRuntime.queryInterface(XText.class, drawShape); 
    XPropertySet xShapeProps = UnoRuntime.queryInterface(
     XPropertySet.class, drawShape); 
    xShapeText.setString("DEF"); 
} catch(Exception e) { 
    e.printStackTrace(System.err); 
    System.exit(1); 
} 

Pour l'exécuter, j'ai ouvert un nouveau LibreOffice Draw fichier, puis appuyé sur « Exécuter le projet » dans NetBeans. Ce fut le résultat:

enter image description here

Il ressemble à l'exception peut être causée par un problème de connexion au document. Comment exactement exécutez-vous la macro?

Connexe: Cette question est également postée à https://forum.openoffice.org/en/forum/viewtopic.php?f=20&p=395334, qui contient une solution dans Basic.

+0

Merci pour votre réponse. C'était un problème avec les versions de LibreOffice, j'ai mis à jour tout ce que je pouvais et ça a marché. Quoi qu'il en soit, merci pour votre temps. – jarssonn