编程语言
首页 > 编程语言> > java-如何使用UNO获取打开的文档?

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

作者:互联网

我正在编写一个打开对话框的加载项,我需要访问当前打开的文本文档,但我不知道该如何获取.

我在NetBeans中使用OpenOffice插件,并且从一个附加项目开始.它创建了一个为我提供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 forum上发布了这个问题,但是我没有得到任何答复.我现在在这里试试运气.

解决方法:

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

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

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

至于错误,它的构建方式可能存在问题.需要检查的几件事:

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

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

标签:openoffice-org,java,uno
来源: https://codeday.me/bug/20191013/1908051.html