2012-06-01 9 views
7

मैं लिब्रे ऑफिस सर्वर साइड पर काम कर रहा हूँ: सर्वर पर मैंलिबर ऑफिस यूएनओ जावा एपीआई: दस्तावेज़ कैसे खोलें, मैक्रो निष्पादित करें और इसे बंद करें?

soffice --accept=... 

फिर चलाने मैं जावा लिब्रे ऑफिस ग्राहक एपीआई एक दस्तावेज़ (calc या लेखक) पर एक मैक्रो लागू करने के लिए इस्तेमाल करते हैं। जावा निष्पादन कोई त्रुटि नहीं देता है, लेकिन मुझे नौकरी नहीं मिलती है (मैक्रो कोड निष्पादित किया जाता है, लेकिन इसका प्रभाव आउटपुट फ़ाइल में नहीं है)। अधिक, मैक्रो स्क्रिप्ट के बाद, मूल डीबगर विंडो दिखाई देती है, जाहिर है कि मेरे मैक्रो की पहली पंक्ति पर रुक गया है; 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; 

सब कुछ ठीक है। मुझे लगता है कि यह कोई मुद्दा नहीं है, के बाद से जार फ़ाइल सर्वर साइड मार डाला जाता है ...

आशा है कि यह मदद कर सकते हैं ... :-)

संबंधित मुद्दे