7

我在 LibreOffice 服务器端工作:在我运行的服务器上

soffice --accept=...

然后我使用 Java LibreOffice 客户端 API 对文档(计算或编写器)应用宏。java执行没有给出任何错误,但我没有完成工作(宏代码被执行,但它的效果不在输出文件中)。此外,在调用宏脚本后,会出现基本调试器窗口,显然停在我的宏的第一行;F5 不重启...

这是我正在使用的相关代码:

    try {
        XComponentContext xLocalContext = Bootstrap.createInitialComponentContext(null);
        System.out.println("xLocalContext");

        XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager();
        System.out.println("xLocalServiceManager");

        Object urlResolver = xLocalServiceManager.createInstanceWithContext(
                "com.sun.star.bridge.UnoUrlResolver", xLocalContext);
        System.out.println("urlResolver");

        XUnoUrlResolver xUrlResolver =
            (XUnoUrlResolver) UnoRuntime.queryInterface(XUnoUrlResolver.class, urlResolver);            
        System.out.println("xUrlResolve");

        try {
            String uno = "uno:" + unoMode + ",host=" + unoHost + ",port=" + unoPort + ";" + unoProtocol + ";" + unoObjectName;
            Object rInitialObject = xUrlResolver.resolve(uno);
            System.out.println("rInitialObject");

            if (null != rInitialObject) {
                XMultiComponentFactory xOfficeFactory = (XMultiComponentFactory) UnoRuntime.queryInterface(
                    XMultiComponentFactory.class, rInitialObject);
                System.out.println("xOfficeFactory");

                Object desktop = xOfficeFactory.createInstanceWithContext("com.sun.star.frame.Desktop", xLocalContext);
                System.out.println("desktop");

                XComponentLoader xComponentLoader = (XComponentLoader)UnoRuntime.queryInterface(
                    XComponentLoader.class, desktop);
                System.out.println("xComponentLoader");

                PropertyValue[] loadProps = new PropertyValue[3];

                loadProps[0] = new PropertyValue();
                loadProps[0].Name = "Hidden";
                loadProps[0].Value = Boolean.TRUE;

                loadProps[1] = new PropertyValue();
                loadProps[1].Name = "ReadOnly";
                loadProps[1].Value = Boolean.FALSE;

                loadProps[2] = new PropertyValue();
                loadProps[2].Name = "MacroExecutionMode";
                loadProps[2].Value = new Short(com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE_NO_WARN);

                try {
                    XComponent xComponent = xComponentLoader.loadComponentFromURL("file:///" + inputFile, "_blank", 0, loadProps);              
                    System.out.println("xComponent from " + inputFile);

                    String macroName = "Standard.Module1.MYMACRONAME?language=Basic&location=application";
                    Object[] aParams = null;

                    XScriptProviderSupplier xScriptPS = (XScriptProviderSupplier) UnoRuntime.queryInterface(XScriptProviderSupplier.class, xComponent);
                    XScriptProvider xScriptProvider = xScriptPS.getScriptProvider(); 
                    XScript xScript = xScriptProvider.getScript("vnd.sun.star.script:"+macroName); 

                    short[][] aOutParamIndex = new short[1][1]; 
                    Object[][] aOutParam = new Object[1][1];

                    @SuppressWarnings("unused")
                    Object result = xScript.invoke(aParams, aOutParamIndex, aOutParam);
                    System.out.println("xScript invoke macro" + macroName);

                    XStorable xStore = (XStorable)UnoRuntime.queryInterface(XStorable.class, xComponent);
                    System.out.println("xStore");

                    if (outputFileType.equalsIgnoreCase("pdf")) {
                        System.out.println("writer_pdf_Export");
                        loadProps[0].Name = "FilterName";
                        loadProps[0].Value = "writer_pdf_Export";
                    }
                    xStore.storeToURL("file:///" + outputFile, loadProps);
                    System.out.println("storeToURL to file " + outputFile);

                    xComponent.dispose();

                    xComponentLoader = null;
                    rInitialObject = null;

                    System.out.println("done.");

                    System.exit(0);

                } catch(IllegalArgumentException e) {
                    System.err.println("Error: Can't load component from url " + inputFile);
                }
            } else {
                System.err.println("Error: Unknown initial object name at server side");
            }           
        } catch(NoConnectException e) {
            System.err.println("Error: Server Connection refused: check server is listening...");           }
    } catch(java.lang.Exception e) {
        System.err.println("Error: Java exception:");
        e.printStackTrace();
    }
4

1 回答 1

7

经过长时间的反复试验,我确实找到了问题(对我来说,其原因一直很模糊......)。该组件不应在“隐藏”模式下执行,因此,只需:

loadProps[1].Name = "Hidden";
loadProps[1].Value = Boolean.FALSE;

一切都好。我想这不是问题,因为 jar 文件是在服务器端执行的......

希望它可以帮助... :-)

于 2012-06-01T15:03:52.100 回答