2012-06-01 40 views
7

私はLibreOfficeのサーバサイドに取り組んでいます:サーバー上で私はその後、私は、文書(CALCまたはライター)にマクロを適用するためのJava LibreOfficeのクライアントAPIのを使用LibreOffice UNO Java API:ドキュメントを開いてマクロを実行して閉じますか?

soffice --accept=... 

を実行します。 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(); 
    } 

答えて

6

を試行錯誤の長い時間後、私は(その原因はかなりあることを維持し、問題を見つけました私にはわかりません...)。 コンポーネントだけで、「隠し」モードで実行、そうすべきではありません。

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

すべてがOKです。私は

:-) ...それが役立つことを願って... jarファイルをサーバー側で実行されているので、それは、問題ではありませんと仮定します
関連する問題