【问题标题】:Java LibreOffice Draw - Set text of a shapeJava LibreOffice Draw - 设置形状的文本
【发布时间】:2016-09-02 08:04:35
【问题描述】:

我正在使用 Java 和 LibreOffice API,我想绘制矩形并设置它们的名称,或者在它们上面放置一些文本字段。绘制形状相对容易,但添加文字真的很难。我在文档和论坛中都没有找到任何解决方案。

我这样声明形状和文本:

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);

然后我尝试设置 XText:

xShapeText.setString("ABC");

这就是问题出现的地方(即使在阅读了文档中的解释后,我也不清楚这个异常):

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) 在 com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:303) 在 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(未知来源) 在 com.ericsson.stpdiagramgenerator.presentation.core.HelloTextTableShape.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(Native Method) 在 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) 引起:java.io.IOException: com.sun.star.io.IOException: EOF达到 - socket,host=localhost,port=8100,localHost=localhost.localdomain,localPort=34456,peerHost=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)

也许您有另一种解决方案,可以使用 LibreOffice API 在形状上插入文本/文本框/文本字段。

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!尽量避免像“我有一个大问题”这样的陈述。相反,只需解释问题所在。除此之外,这是一个写得很好的问题。文档链接也可能有所帮助,尽管在这种情况下我能够轻松找到相关的 UNO API 链接。

标签: java libreoffice libreoffice-draw


【解决方案1】:

您的代码在我的机器上运行良好。我在 Windows 上的 LibreOffice 5.1.0.3 中对其进行了测试。这是我使用的代码:

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);
}

为了运行它,我打开了一个新的 LibreOffice Draw 文件,然后在 NetBeans 中按下“运行项目”。结果是这样的:

看起来异常可能是由连接到文档的问题引起的。你究竟是如何运行宏的?

相关:这个问题也发布在https://forum.openoffice.org/en/forum/viewtopic.php?f=20&p=395334,其中包含一个基本的解决方案。

【讨论】:

  • 感谢您的回答。这是 LibreOffice 版本的一些问题,我更新了所有我可以更新的东西并且它有效。无论如何,感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2021-06-13
  • 2013-11-18
  • 1970-01-01
相关资源
最近更新 更多