2013-07-05 101 views
4

我有一個ColdFusion應用程序,它從目錄中讀取文件列表,然後使用JODConverter庫和OpenOffice.org 3.4.1將列表中的每個MSOffice文檔轉換爲PDF。爲什麼我的電話啓動OpenOffice服務在開發中工作,而不是在服務器上工作?

我寫在這裏,根據這兩篇文章中的說明這個應用程序和設置我的開發PC:

http://cfsearching.blogspot.com/search/label/JODConverter

唯一的區別是,我安裝的cf_root之外必要的JAR文件。

<cffunction name="convertNonPDFFiles" returntype="Void" output="false"> 
    <cfscript> 
     // CONSTANTs 
     var _NON_PDF_PATH = APPLICATION.PDFSource & "\NonPDFs"; 
     var _PDF_PATH = APPLICATION.PDFSource & "\PDFs"; 
     var _VALID_FILE_EXTENSIONS = "doc,docx,ppt,pptx"; 

     // Set defaults for private variables 
     var _qNonPDFDir = QueryNew(""); 
     var _fileName = ""; 
     var _documentId = 0; 
     var _sourceFilePath = ""; 
     var _destinationFilePath = ""; 
     var _fileExtension = ""; 
     var _isConversionSuccessful = true; 
     var _tempSourceFilePath = ""; 
     var _tempImageFilePath = ""; 

     // Initialize Open Office Conversion Manager 
     var _openOfficeManager = 
      CreateObject(
       "java", 
       "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration" 
       ).setOfficeHome(
        APPLICATION.OpenOfficeProgramPath // Location of the OpenOffice.org 3.4.1 application directory on the server 
        ).setTaskExecutionTimeout(60000).buildOfficeManager(); 

     _openOfficeManager.start(); 
    </cfscript> 

    <!--- Retrieve a list of file names in the directory of unprocessed 
     non-PDF files ---> 
    <cfdirectory 
     action="list" 
     directory="#_NON_PDF_PATH#" 
     name="_qNonPDFDir" 
     type="file" 
     listinfo="name" 
     sort="datelastmodified DESC" /> 

    <cfoutput query="_qNonPDFDir"> 
     <cfscript> 
      _fileName = _qNonPDFDir.name; 
      _fileExtension = 
       REQUEST.UDFLib.File.getFileExtension(_fileName); 
      _sourceFilePath = _NON_PDF_PATH & "\" & _fileName; 

      // File is a valid format for conversion 
      if (ListFindNoCase(_VALID_FILE_EXTENSIONS, _fileExtension)) { 
       _documentId = 
        REQUEST.UDFLib.File.getFileNameWithoutExtension(
         _fileName 
         ); 
       _destinationFilePath = 
         _PDF_PATH 
        & "\" 
        & REQUEST.UDFLib.File.getFileNameWithoutExtension(
          _fileName 
          ) 
        & ".pdf"; 
       _isConversionSuccessful = true; 
       _tempSourceFilePath = 
         APPLICATION.TempDir 
        & "\" 
        & _documentId 
        & "." & _fileExtension; 

       /* 
        Create of the copy of the original file in the temp 
        directory 
       */ 
       FileCopy(
        APPLICATION.of_aprimo_root & "\" & _documentId & ".dat", 
        _tempSourceFilePath 
        ); 

       // Attempt to convert the file to PDF 
       try { 
        // See convertFile() method below 
        convertFile(
         openOfficeManager = _openOfficeManager, 
         inputFilePath = _tempSourceFilePath, 
         outputFilePath = _destinationFilePath 
         ); 
       } 
       catch (any e) { 
        _isConversionSuccessful = false; 
       } 

       if (_isConversionSuccessful) 
        FileMove(
         _sourceFilePath, 
         _NON_PDF_PATH & "\Processed\" 
         ); 
       else 
        FileMove(
         _sourceFilePath, 
         _NON_PDF_PATH & "\NonFunctioning\" 
         ); 
      } 
      // File is not a valid format for conversion 
      else { 
       FileDelete(_sourceFilePath); 
      } 
     </cfscript> 
    </cfoutput> 

    <cfscript> 
     _openOfficeManager.stop(); 

     return; 
    </cfscript> 
</cffunction> 

<cfscript> 
    function convertFile(openOfficeManager, inputFilePath, outputFilePath) { 
     CreateObject(
      "java", 
      "org.artofsolving.jodconverter.OfficeDocumentConverter" 
      ).init(ARGUMENTS.OpenOfficeManager).convert(
       CreateObject(
        "java", 
        "java.io.File" 
        ).init(ARGUMENTS.inputFilePath), 
       CreateObject(
        "java", 
        "java.io.File" 
        ).init(ARGUMENTS.outputFilePath) 
       ); 

     return; 
    } 
</cfscript> 

該應用程序在我的開發機器上工作完美,但只要我將它移動到我的Web服務器之一,它就不會在那裏工作。

開發PC設置:

OS: Windows 7 Professional SP1 
IIS: 7 
ColdFusion: 8.0.1 

服務器設置:

OS: Windows 2003 R2 Standard Edition SP2 
IIS: 6.0 
ColdFusion: 8.0.1 

當我試圖在服務器上運行的應用程序 - 無論是直接在瀏覽器中,或通過計劃任務,它沒有拋出異常。它似乎運行,直到60分鐘後超時。在任務管理器中,我可以看到soffice.bin在應用程序啓動時開始運行,但幾秒鐘後,soffice.bin就從任務管理器中消失。

任何想法可能是什麼問題?

+0

你檢查,以確保'應用。 OpenOfficeProgramPath'在兩種環境中都是一樣的嗎? – Lance

+0

@Lance,是的,我有,這是一個配置設置,在兩個環境中設置不同。我已經確認OpenOfficeManager對象已正確實例化,但當它調用start()時,它只是永遠不會回來...... –

+0

聽起來好像連接可能有問題。日誌文件說什麼?另外,jodconverter是否可以在該機器上工作 - 例如從命令行? – Leigh

回答

1

經過一些故障排除後,我終於能夠通過對編程進行一些小改動(所有功勞歸功於cfSearching - 我在http://cfsearching.blogspot.com/search/label/JODConverter的評論中找到了我的問題的答案)。

原代碼,配置和啓動的OpenOfficeManager實例:

  CreateObject(
       "java", 
       "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration" 
       ).setOfficeHome(
        APPLICATION.OpenOfficeProgramPath 
        ).setTaskExecutionTimeout(60000).buildOfficeManager(); 

更新(固定)添加setConnectionProtocol()和setPortNumber():

  CreateObject(
       "java", 
       "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration" 
       ).setOfficeHome(
        APPLICATION.OpenOfficeProgramPath 
        ).setConnectionProtocol(
         CreateObject(
          "java", 
          "org.artofsolving.jodconverter.office.OfficeConnectionProtocol" 
          ).SOCKET 
         ).setPortNumber(
          8100 
          ).setTaskExecutionTimeout(
           60000 
           ).buildOfficeManager(); 
0

它可能和OpenOffice一樣簡單,需要在服務器上重新安裝,因爲它在您的開發機器上。

+0

安裝看起來不錯。實際上,我將它安裝在兩臺配置類似的服務器上(QA和UAT服務器),並重新啓動了所有三臺服務器,生產箱是唯一導致問題的服務器。 –

相關問題