2012-06-01 8 views
7

Ben LibreOffice sunucu tarafında üzerinde çalışıyorum: sunucuda Ben SonraLibreOffice UNO Java API: bir belgeyi açmak, makro yürütmek ve kapatmak nasıl?

soffice --accept=... 

çalıştırmak Java LibreOffice istemci API en belgeye (kalk ya yazar) üzerinde bir makro uygulamak için kullanın. Java yürütmesi herhangi bir hata vermez, ancak işi tamamlamıyorum (makro kodu yürütülür, ancak etkileri çıktı dosyasında değil). Daha fazla, makro komut dosyası çalıştırıldıktan sonra, makroda ilk satırda açıkça durdurulan Temel hata ayıklayıcı penceresi görünür; Ben sadece kimin neden oldukça olmayı tutar sorunu (buldunuz

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(); 
    } 

cevap

6

deneme yanılma uzun saatler sonra: F5 Bu kullanıyorum alakalı kodu ...

yeniden başlatın gelmez belirsiz, bana ...). bileşen sadece birlikte, "Gizli" modunda çalıştırılır, böylece edilmemelidir:

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

her şey Tamam. Ben

:-) ...

faydası Umut ... kavanoz dosya sunucu tarafı yürütüldüğünde bu yana, sorun olmaz herhalde
İlgili konular