如何使用UNO获取打开的文档?

我正在编写一个打开对话框的附加组件,我需要访问当前打开的文本文档,但我不知道如何获取它。

我在NetBeans中使用OpenOffice插件,我从一个Add-on项目开始。 它创建了一个类,它给了我一个XComponentContext实例,但我不知道如何使用它来获取当前文档的OfficeDocument实例。

我已经谷歌搜索了一段时间,我找不到任何使用现有的,打开的文档的例子。 它们都是从一个新文档或首先加载的文档开始的,因此它们有一个URL。

我根据OpenOffice wiki( https://wiki.openoffice.org/wiki/API/Samples/Java/Office/DocumentHandling )试了一下,这就是我想出的:

private OfficeDocument getDocument() { if (this.officeDocument == null) { try { // this causes the error XMultiComponentFactory xMultiComponentFactory = this.xComponentContext.getServiceManager(); Object oDesktop = xMultiComponentFactory.createInstanceWithContext("com.sun.star.frame.Desktop", this.xComponentContext); XComponentLoader xComponentLoader = UnoRuntime.queryInterface(XComponentLoader.class, oDesktop); String url = "private:factory/swriter"; String targetFrameName = "_self"; int searchFlags = FrameSearchFlag.SELF; PropertyValue[] propertyValues = new PropertyValue[1]; propertyValues[0] = new PropertyValue(); propertyValues[0].Name = "Hidden"; propertyValues[0].Value = Boolean.TRUE; XComponent xComponent = xComponentLoader.loadComponentFromURL(url, targetFrameName, searchFlags, propertyValues); XModel xModel = UnoRuntime.queryInterface(XModel.class, xComponent); this.officeDocument = new OfficeDocument(xModel); } catch (com.sun.star.uno.Exception ex) { throw new RuntimeException(ex); } } return this.officeDocument; } 

但是有一些奇怪的事情发生了。 只是在我的类中使用此方法, 即使它从未在任何地方被调用 ,在添加附加组件时会导致错误。

 (com.sun.star.depoyment.DeploymentDescription){{ Message = "Error during activation of: VaphAddOn.jar", Context = (com.sun.star.uno.XInterface) @6ce03e0 }, Cause = (any) {(com.sun.star.registry.CannotRegisterImplementationException){{ Message = "", Context = (com.sun.star.uno.XInterface) @0 }}}} 

看来这行会导致错误:

 XMultiComponentFactory xMultiComponentFactory = this.xComponentContext.getServiceManager(); 

我不知道如何先行。

我在OpenOffice论坛上发布了这个问题,但我没有在那里得到回复。 我现在在这里试试运气。

在代码中使用它来获取当前文档:

 import com.sun.star.frame.XDesktop; ... XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class, oDesktop); XComponent xComponent = xDesktop.getCurrentComponent(); 

我在NetBeans中打开了BookmarkInsertion示例 ,并添加了此代码以使用当前文档而不是加载新文档。

就错误而言,可能存在如何构建错误的问题。 要检查的几件事:

  • Office SDK版本是否与Office版本匹配? 检查版本号以及它是32位还是64位。
  • 确保在NetBeans中的库下显示4个.jar文件(juh.jar,jurt.jar,unoil.jar,ridl.jar),因为它们需要与加载项一起包含在内。

如果您对尝试正确设置构建感到沮丧,那么您可能会发现使用python更容易,因为它不需要编译。 python也不需要queryInterface()。