2016-04-28 236 views
0

我有這ConversionInputException當我調用​​或schedule()方法在一個特定的轉換器。ConversionInputException在複雜的Web應用程序

我認爲這是正確的代碼,因爲如果我作爲一個簡單的Java應用程序執行該代碼,它完全適用於輸入相同的文件。

當我將代碼部署爲jar並從複雜的Web應用程序中調用代碼時,我總是有這個ConversionInputException

我也嘗試過InputStream insted的File對象,但我有同樣的異常。

我可以用MS-Word打開沒有任何問題的文件,我也可以在運行相同代碼的獨立Java應用程序中將其轉換。

下面是我用

private void convert(File inputFile, File outputFile) { 
    boolean conversion=false; 
    IConverter converter=com.b80.common.d2.wf.utility.CustomConverter.getInstance().getConverter(); 
    conversion = converter.convert(inputFile).as(DocumentType.MS_WORD) 
          .to(outputFile).as(DocumentType.PDF) 
          .prioritizeWith(1000).execute(); 
} 

的代碼,它的如下研製的轉換器類 - 我不得不使用同步方法,因爲轉換器的該實例可以被多個線程在服務器上進行訪問:

import java.io.File; 
import java.util.concurrent.TimeUnit; 
import com.documents4j.api.IConverter; 
import com.documents4j.job.LocalConverter; 

public class CustomConverter { 
    private static IConverter converter=null; 
    private static final String CONVERSION_FOLDER="E:\\temp\\document4j"; 

    private static CustomConverter instance = null; 
    private CustomConverter() { 
     // Exists only to defeat instantiation. 
    } 
    public static synchronized CustomConverter getInstance() { 
     if(instance == null) { 
     instance = new CustomConverter(); 
     } 
     return instance; 
    } 

    public synchronized IConverter getConverter() { 
    if(converter==null || !converter.isOperational()) { 
     converter=LocalConverter.builder().baseFolder(new File(CONVERSION_FOLDER)).workerPool(20, 25, 5, TimeUnit.MINUTES) 
       .processTimeout(10, TimeUnit.MINUTES) 
       .build(); 
    }  
    return converter; 
    } 
} 

這裏是StackTrace,顯然是convert()函數的例外。

2016-04-28 16:52:21,483 ERROR [STDERR] (http-0.0.0.0-9080-1) com.documents4j.throwables.ConversionInputException: The input file seems to be corrupt 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at com.documents4j.util.Reaction$ConversionInputExceptionBuilder.make(Reaction.java:159) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at com.documents4j.conversion.ExternalConverterScriptResult.resolve(ExternalConverterScriptResult.java:70) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at com.documents4j.conversion.ProcessFutureWrapper.evaluateExitValue(ProcessFutureWrapper.java:48) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:36) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:11) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
2016-04-28 16:52:21,484 ERROR [STDERR] (http-0.0.0.0-9080-1) at java.lang.Thread.run(Thread.java:662) 

我分析更深入的代碼,並添加了一些登錄到word_convert.vbs,我得到這樣的錯誤消息:

Error # 424 Object required 

我知道這是一個有點通用的消息,但我希望它可以多一點幫助。

+0

當詢問異常時的規則#0:POST THE STACK TRACE,並在您的代碼中標識拋出異常的語句。 –

回答

2

我是documents4j的作者,一般來說,我認爲這是一個用戶問題,因爲我已經從多個環境成功運行了documents4j,並且從未遇到過這樣的問題。

很難說出什麼問題,因爲我不知道究竟是什麼讓你的web應用程序複雜。由於響應表明您的文件已損壞,並且由於轉換器在您的應用程序沒有使用複雜程序的情況下工作,我認爲您在某些時候會損壞該文件。

我可以建議你嘗試進行調試:

  1. 實現只接收字節數組,併發送一個虛擬文件回僞轉換器。檢查接收到的字節是否與原始文件的字節相同。也許你正在切斷一些價值觀?
  2. 將您的應用程序逐步減少到可以工作的簡單應用程序,並查看過程中的哪個步驟會破壞您的前提。
+0

我在運行wildfly作爲服務時遇到同樣的問題。當從standalone.bat運行它時,它正常工作。 –

+0

查看作爲服務運行的文檔是額外的分段。 –

+0

running running。不是文件4j。我正在使用documents4j作爲本地轉換器。在哪裏看?預先感謝你 –