Java FileSystemInteractionException:使用documents4j时无法访问目标文件

Java FileSystemInteractionException:使用documents4j时无法访问目标文件,java,vb.net,spring,multipartform-data,documents4j,Java,Vb.net,Spring,Multipartform Data,Documents4j,我正在使用documents4j将word文档转换为pdf,有时我会遇到以下异常 2016-03-28 09:29:16.982 INFO 3660 --- [pool-1-thread-2] c.d.c.msoffice.MicrosoftWordBridge : Requested conversion from C:\conversion-temp\2b33637b-b74a-4aaa-ac65-a5ebc1eb3efc\temp3 (application/msword)

我正在使用documents4j将word文档转换为pdf,有时我会遇到以下异常

2016-03-28 09:29:16.982  INFO 3660 --- [pool-1-thread-2] c.d.c.msoffice.MicrosoftWordBridge       : Requested conversion from C:\conversion-temp\2b33637b-b74a-4aaa-ac65-a5ebc1eb3efc\temp3 (application/msword) to C:\conversion-temp\2b33637b-b74a-4aaa-ac65-a5ebc1eb3efc\temp4 (application/pdf)
2016-03-28 09:29:17.372 ERROR 3660 --- [http-nio-8080-exec-9] c.s.c.e.mappers.ExceptionMapper          : Exception while handling request

com.documents4j.throwables.FileSystemInteractionException: Could not access target file
  at com.documents4j.util.Reaction$FileSystemInteractionExceptionBuilder.make(Reaction.java:180) ~[documents4j-util-all-1.0.2.jar:na]
  at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75) ~[documents4j-util-all-1.0.2.jar:na]
  at com.documents4j.conversion.ExternalConverterScriptResult.resolve(ExternalConverterScriptResult.java:70) ~[documents4j-transformer-api-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.evaluateExitValue(ProcessFutureWrapper.java:48) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:36) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:11) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78) ~[documents4j-util-conversion-1.0.2.jar:na]
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_74]
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_74]
  at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_74]
com.documents4j.throwables.ConverterAccessException: The converter seems to be shut down
  at com.documents4j.util.Reaction$ConverterAccessExceptionBuilder.make(Reaction.java:117) ~[documents4j-util-all-1.0.2.jar:na]
  at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75) ~[documents4j-util-all-1.0.2.jar:na]
  at com.documents4j.conversion.ExternalConverterScriptResult.resolve(ExternalConverterScriptResult.java:70) ~[documents4j-transformer-api-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.evaluateExitValue(ProcessFutureWrapper.java:48) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:36) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:11) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78) ~[documents4j-util-conversion-1.0.2.jar:na]
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_74]
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_74]
  at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_74]
出现此异常后,documents4j库将拒绝任何进一步的请求,但出现以下异常

2016-03-28 09:29:16.982  INFO 3660 --- [pool-1-thread-2] c.d.c.msoffice.MicrosoftWordBridge       : Requested conversion from C:\conversion-temp\2b33637b-b74a-4aaa-ac65-a5ebc1eb3efc\temp3 (application/msword) to C:\conversion-temp\2b33637b-b74a-4aaa-ac65-a5ebc1eb3efc\temp4 (application/pdf)
2016-03-28 09:29:17.372 ERROR 3660 --- [http-nio-8080-exec-9] c.s.c.e.mappers.ExceptionMapper          : Exception while handling request

com.documents4j.throwables.FileSystemInteractionException: Could not access target file
  at com.documents4j.util.Reaction$FileSystemInteractionExceptionBuilder.make(Reaction.java:180) ~[documents4j-util-all-1.0.2.jar:na]
  at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75) ~[documents4j-util-all-1.0.2.jar:na]
  at com.documents4j.conversion.ExternalConverterScriptResult.resolve(ExternalConverterScriptResult.java:70) ~[documents4j-transformer-api-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.evaluateExitValue(ProcessFutureWrapper.java:48) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:36) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:11) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78) ~[documents4j-util-conversion-1.0.2.jar:na]
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_74]
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_74]
  at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_74]
com.documents4j.throwables.ConverterAccessException: The converter seems to be shut down
  at com.documents4j.util.Reaction$ConverterAccessExceptionBuilder.make(Reaction.java:117) ~[documents4j-util-all-1.0.2.jar:na]
  at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75) ~[documents4j-util-all-1.0.2.jar:na]
  at com.documents4j.conversion.ExternalConverterScriptResult.resolve(ExternalConverterScriptResult.java:70) ~[documents4j-transformer-api-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.evaluateExitValue(ProcessFutureWrapper.java:48) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:36) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:11) ~[documents4j-util-transformer-process-1.0.2.jar:na]
  at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78) ~[documents4j-util-conversion-1.0.2.jar:na]
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_74]
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_74]
  at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_74]
这就是我如何进行文档转换的方法

我正在实例化LocalConverter的一个实例

LocalConverter.builder().workerPool(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MINUTES).baseFolder(baseFolder).processTimeout(processTimeout, TimeUnit.SECONDS).build();

corePoolSize is 5
maximumPoolSize is 10
keepAliveTime is 3 minutes
processTimeout is 20 minutes
我使用这个例子,就像

public File convertFile(MultipartFile file) throws ConversionException {
        try(InputStream docStream = file.getInputStream(); ByteArrayOutputStream pdfStream = new ByteArrayOutputStream()) {
            boolean status = iConverter.convert(docStream, false).as(DocumentType.DOC).to(pdfStream, false).as(DocumentType.PDF).execute();
            if(status) {
                // conversion is success, send the response
                File response = new File();
                //InputStream responseStream = new ByteArrayInputStream(pdfStream.toByteArray());
                response.setContentLength(pdfStream.size());
                //response.setInputStream(responseStream);
                response.setOutputStream(pdfStream);
                return response;
            } else {
                LOGGER.error("Failed to convert word to pdf, conversion status is {}", status);
                throw new ConversionException("failed to convert word to pdf");
            }
        } catch (FileSystemInteractionException fsie) {
            LOGGER.error("documents4j file system interaction exception", fsie);
            throw new ConversionException("File system exception", fsie);
        } catch(IOException ioe) {
            throw new ConversionException("Cannot read the input stream of file", ioe);
        }
    }
此多部分文件是spring多部分文件。 我检查了documents4j用于转换的vb脚本,我知道当wordDocument未正确关闭时会发生此错误。下面是导致此错误的vb脚本的代码段

' Close the source document.
wordDocument.Close WdDoNotSaveChanges
If Err <> 0 Then
    WScript.Quit -3
End If
On Error GoTo 0
”关闭源文档。
wordDocument.Close WdDoNotSaveChanges
如果错误为0,则
WScript.Quit-3
如果结束
错误转到0
我不确定为什么会出现
FileSystemInteractionException

我可以想到两个假设

  • 我同时发送多个请求,文件被其他线程删除
  • 我从MultipartFile对象获取inputstream,而multipart文件是一个临时文件,根据文档,用户负责将内容复制到持久存储

  • 如何解决此错误以及此错误的根本原因。

    此错误可能有多种原因:

    com.documents4j.throwables.FileSystemInteractionException: Could not access target file
    
    com.documents4j.throwables.FileSystemInteractionException: Could not access target file
    

    您是否已尝试将上载的多部分文件保存到临时文件,然后将此临时文件传递给转换器?我知道这是不必要的开销。但是,如果这样做有效,那么我们可以安全地假设,当IConverter实例尝试访问输入“docstream”时,输入“docstream”没有完全填充,因此会出现错误。在这种情况下,您应该确保在尝试转换之前填充inputstream,这将解决您的问题

    如果即使在“基于文件”的转换方案中也出现此错误,请尝试以下步骤:

  • 确保MS Office应用程序未运行(因为您在外部打开了word文档)
  • 确保在物理机器(而不仅仅是JVM)上运行一个且只有一个IConverter实例
  • 如果您将Tomcat作为服务运行(我假设您正在Tomcat上部署它),那么您运行Tomcat的不是系统帐户服务,而是本地用户帐户
  • 在web应用程序中,您应该创建一次IConverter实例(就像在singleton类中一样),并且无论何时您的业务方法之一请求它,它都应该返回相同的实例。此外,如果您预期同时发生文档转换请求,请不要关闭转换器

  • 理想情况下,其中一个步骤可以解决您手头的问题,如果您仍然面临此问题,请在评论中告诉我。

    我也面临同样的错误。 我在Spring Boot应用程序中使用了这个PDF转换,并在Windows服务器中部署了它。 当我手动运行这个应用程序(使用java-jar)时,它工作得非常好。 但是,当我将其作为Windows服务启动(使用winsw.exe)时,它给了我一个错误: