简体   繁体   中英

FileSystemInteractionException: Could not access target file while using documents4j

I am using documents4j to convert word documents to pdf and some time I am getting below exception

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]

After this exception any further requests are rejected by the documents4j library with below exception

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]

This is how I am doing the documents conversion.

I am instantiating an instance of 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

And I am using this instance like

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

This multipart file is spring multipart file. I checked the vb script that documents4j uses for the conversion and I came to know that this error occurs when the wordDocument was not closed properly. Below is the snippet from vb script which is the source of this error

' Close the source document.
wordDocument.Close WdDoNotSaveChanges
If Err <> 0 Then
    WScript.Quit -3
End If
On Error GoTo 0

I am not sure why I am getting FileSystemInteractionException .

There are two assumptions that I can think of

  1. I am sending multiple simultaneous requests and the file is deleted by some other thread
  2. I am getting the inputstream from MultipartFile object and the multipart file is a temporary and as per the documentation the user is responsible to copy the content to a persistent storage.

spring official docs

How can I resolve this error and what is the root cause of this error.

There can be multiple reasons for this error:

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

Exception documentation here

Have you tried saving the uploaded multi-part file to a temporary file, then passing this temporary file to the converter? I am aware this is an unnecessary overhead. However, if this works, then we can safely assume that the input "docstream" isn't populated completely when the IConverter instance tries to access it, and hence the error. In this case, you should ensure that the inputstream is populated before attempting conversion and that should resolve your issue.

If you get this error even for "file-based" conversion scenarios, try the following steps:

  1. Ensure that MS Office applications aren't running (because you opened a word document externally)
  2. Ensure that there is one and only one instance of IConverter running across the physical machine (and not just the JVM)
  3. If you are running Tomcat as a service (I'm assuming you're deploying this on Tomcat), you are running tomcat not as a SYSTEM account service but a local user account.
  4. In a web application, you should have the IConverter instance being created once (like in a singleton class), and it should return the same instance whenever requested by one of your business methods. Also, do not shut down the converter if you anticipate simultaneous document conversion requests.

Ideally one of these steps should solve your issue at hand, let me know in the comments if you still face this issue.

I am also facing the same error. I used this PDF conversion inside a Spring Boot application and deployed it, in a Windows Server. When I run this application manually (using java -jar), it's working perfectly fine. But, when I start this as a Windows Service(using winsw.exe), it is giving me the error:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM