document4j не сохраняет файл после преобразования

Я преобразовал файл .docx в .pdf с помощью document4j, однако pdf не отображается, даже журналы показывают успешное преобразование.

26-Jun-2020 21:45:38.163 INFO [http-nio-80-exec-423] com.documents4j.conversion.msoffice.MicrosoftWordBridge.startUp From-Microsoft-Word-Converter was started successfully
26-Jun-2020 21:45:38.163 INFO [http-nio-80-exec-423] com.documents4j.job.LocalConverter.<init> The documents4j local converter has started successfully
26-Jun-2020 21:45:38.187 INFO [pool-50-thread-1] com.documents4j.conversion.msoffice.AbstractMicrosoftOfficeBridge.doStartConversion Requested conversion from C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\stock\batimp\RECTO_BAT20200045.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document) to C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\stock\batimp\RECTO_BAT20200045.pdf (application/pdf)
26-Jun-2020 21:45:38.440 INFO [http-nio-80-exec-423] com.documents4j.conversion.msoffice.MicrosoftWordBridge.shutDown From-Microsoft-Word-Converter was shut down successfully
26-Jun-2020 21:45:38.440 INFO [http-nio-80-exec-423] com.documents4j.job.LocalConverter.shutDown The documents4j local converter has shut down successfully

Также отладка показала следующее:

LocalConversion{pending=false, cancelled=false, done=true, priority=Priority{value=500, creationTime=1593207938174}, file-system-target=C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\stock\batimp\RECTO_BAT20200045.pdf} 

Почему pdf не отображается в каталоге?

фрагмент программы

File wordFile = new File(FILE_NAMEX), target = new File(outputFile1);
IConverter converter = LocalConverter.builder().baseFolder(new File(path+"batimp"))
.workerPool(20, 25, 2, TimeUnit.SECONDS)
.processTimeout(5, TimeUnit.SECONDS).build();
Future<Boolean> conversion = converter.convert(wordFile).as(DocumentType.DOCX).to(target).as(DocumentType.PDF)
.schedule();
converter.shutDown();

Добавление convert.get() вызывает следующую ошибку

> 29-Jun-2020 08:52:21.475 INFO [http-nio-80-exec-1]
> com.documents4j.conversion.msoffice.MicrosoftWordBridge.startUp
> From-Microsoft-Word-Converter was started successfully 29-Jun-2020
> 08:52:21.475 INFO [http-nio-80-exec-1]
> com.documents4j.job.LocalConverter.<init> The documents4j local
> converter has started successfully 29-Jun-2020 08:52:21.511 INFO
> [pool-1-thread-1]
> com.documents4j.conversion.msoffice.AbstractMicrosoftOfficeBridge.doStartConversion
> Requested conversion from C:\Program Files\Apache Software
> Foundation\Tomcat
> 9.0\webapps\stock\batimp\FICHE_TECHNIQUE_BAT20200045.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)
> to C:\Program Files\Apache Software Foundation\Tomcat
> 9.0\webapps\stock\batimp\FICHE_TECHNIQUE_BAT20200045.pdf (application/pdf) java.util.concurrent.ExecutionException: Could not
> complete conversion
>         at com.documents4j.job.FailedConversionFuture.get(FailedConversionFuture.java:35)
>         at com.documents4j.job.FailedConversionFuture.get(FailedConversionFuture.java:10)
>         at com.documents4j.job.AbstractFutureWrappingPriorityFuture.get(AbstractFutureWrappingPriorityFuture.java:205)
>         at com.documents4j.job.AbstractFutureWrappingPriorityFuture.get(AbstractFutureWrappingPriorityFuture.java:10)
>         at downloadbatimp.doGet(downloadbatimp.java:145)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
>         at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
>         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
>         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
>         at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
>         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
>         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
>         at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
>         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
>         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
>         at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
>         at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
>         at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
>         at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
>         at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
>         at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
>         at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
>         at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
>         at java.base/java.lang.Thread.run(Thread.java:832) Caused by: com.documents4j.throwables.ConverterAccessException: The converter
> seems to be shut down
>         at com.documents4j.util.Reaction$ConverterAccessExceptionBuilder.make(Reaction.java:117)
>         at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75)
>         at com.documents4j.conversion.ExternalConverterScriptResult.resolve(ExternalConverterScriptResult.java:70)
>         at com.documents4j.conversion.ProcessFutureWrapper.evaluateExitValue(ProcessFutureWrapper.java:48)
>         at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:36)
>         at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:11)
>         at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78)
>         at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
>         at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)

person Mo Alex    schedule 26.06.2020    source источник
comment
Что возвращает conversion.get()?   -  person stdunbar    schedule 27.06.2020
comment
Он показывает, что преобразователь выключен. Странно, что тот же код работает на cmd без проблем, но не на tomcat, даже если включены все файлы lib jar.   -  person Mo Alex    schedule 28.06.2020


Ответы (2)


tomcat 9 по умолчанию, как служба Windows, запускается под локальной службой. изменив вход в учетную запись локальной системы, указанная ошибка исчезла.

однако теперь я застрял с другой ошибкой:

    java.util.concurrent.ExecutionException: Could not complete conversion
        at com.documents4j.job.FailedConversionFuture.get(FailedConversionFuture.java:35)
        at com.documents4j.job.FailedConversionFuture.get(FailedConversionFuture.java:10)
        at com.documents4j.job.AbstractFutureWrappingPriorityFuture.get(AbstractFutureWrappingPriorityFuture.java:205)
        at com.documents4j.job.AbstractFutureWrappingPriorityFuture.get(AbstractFutureWrappingPriorityFuture.java:10)
        at downloadbatimp.doGet(downloadbatimp.java:165)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: com.documents4j.throwables.ConversionInputException: The input file seems to be corrupt
        at com.documents4j.util.Reaction$ConversionInputExceptionBuilder.make(Reaction.java:159)
        at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75)
        at com.documents4j.conversion.ExternalConverterScriptResult.resolve(ExternalConverterScriptResult.java:70)
        at com.documents4j.conversion.ProcessFutureWrapper.evaluateExitValue(ProcessFutureWrapper.java:48)
        at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:36)
        at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:11)
        at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)

Опять же, я считаю, что это связано с правами доступа, которые я не могу понять, кто-нибудь знает, почему отображается это сообщение? обратите внимание, что даже с простым файлом .docx, содержащим один символ, отображается одна и та же трассировка стека.

person Mo Alex    schedule 30.06.2020
comment
Вероятно, вам следует опубликовать это как вопрос, а не как ответ - либо как редактирование существующего вопроса, либо как новый вопрос. Но сначала взгляните здесь и обратите внимание на комментарий: предоставление права доступа администратору домена, а не администратору машины решило проблему. Может быть, это поможет. - person andrewjames; 01.07.2020
comment
Привет, Эндрю, я разместил это как ответ, потому что он решил частичную проблему. Я попробовал право доступа, которое вы упомянули, но безуспешно. - person Mo Alex; 01.07.2020

Объекты File для вашего документа Word и документа PDF должны явно включать пути к их расположению.

В приведенном ниже примере предполагается, что для обоих документов используется одно и то же местоположение, и это то же самое, что и расположение baseFolder (куда конвертер помещает свои временные файлы):

final String dir = "C:/tmp/conversions/";

File wordFile = new File(dir + "sample.docx");
File pdfFile = new File(dir + "sample.pdf");
        
IConverter converter = LocalConverter.builder()
        .baseFolder(new File(dir))
        .workerPool(20, 25, 2, TimeUnit.SECONDS)
        .processTimeout(5, TimeUnit.SECONDS)
        .build();
        
Future<Boolean> conversion = converter
        .convert(wordFile).as(DocumentType.DOCX)
        .to(pdfFile).as(DocumentType.PDF)
        .schedule();
        
converter.shutDown();

Итак, в приведенном выше примере я начинаю с моего документа Word, который уже находится в каталоге conversions.

Просто для записи я использую следующие зависимости:

<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-api</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-local</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-word</artifactId>
    <version>1.1.3</version>
</dependency>

ОБНОВЛЕНИЕ:

Для Tomcat я установил его не как службу Windows, а отдельно, используя 64-битный ZIP-архив Windows, из эта страница.

Я создал очень простой сервлет, который ничего не делает, кроме как запускает код преобразования — тот же код, что и в этом ответе.

Я попробовал это с двумя разными каталогами: один внешний для CATALINA_BASE и один такой же, как CATALINA_BASE.

Все работало, как и ожидалось, без проблем, без необходимости управлять какими-либо разрешениями и т. д. Мой идентификатор пользователя имеет права администратора Windows на ПК.

person andrewjames    schedule 27.06.2020
comment
Моя программа успешно работает при выполнении ее на cmd, но не работает с tomcat 9. Если я добавлю convert.get(), сообщение, которое я получаю, конвертер отключается. Почему у меня нет проблемы при запуске того же кода в cmd? - person Mo Alex; 28.06.2020
comment
Пожалуйста, добавьте всю соответствующую новую информацию к вопросу. Например, конфигурация Tomcat и любые сообщения об ошибках Catalina. Кроме того, Tomcat работает локально? Спасибо @moalex - person andrewjames; 28.06.2020
comment
@MoAlex - Если это поможет: я без проблем запустил приведенный выше код внутри экземпляра Tomcat 9. Это было на моем локальном ПК (где установлен MS-Word). Конечно, это не сработало бы, если бы Tomcat работал на другом сервере без доступа к MS-Word. - person andrewjames; 28.06.2020
comment
Tomcat и MS Word работают на одном сервере. До сих пор не могу понять, почему он должен работать без проблем с использованием cmd, но не работает на tomcat - person Mo Alex; 29.06.2020
comment
Да - это странно. Без дополнительной информации (например, конфигурации и журналов), я не думаю, что вам будет легко помочь, к сожалению. - person andrewjames; 29.06.2020
comment
Я обновил вопрос, чтобы включить трассировку стека - person Mo Alex; 29.06.2020
comment
Я считаю, что это проблема доступа. Существуют ли какие-либо политики или параметры, которые следует включить, чтобы позволить Tomcat запускать MS Word? - person Mo Alex; 29.06.2020
comment
Никаких явных политик или настроек в моей настройке не требовалось, нет. Я использую Windows 10 с последней версией Word, установленной локально. Вы записываете файл PDF в доступный каталог (и находится ли этот каталог внутри или вне каталога установки Tomcat (CATALINA_HOME))? Кстати, у меня есть полный доступ администратора Windows на моем ПК. - person andrewjames; 29.06.2020
comment
Да, конечно. Полный доступ администратора и папка в Catalina Home - person Mo Alex; 29.06.2020
comment
Также я не могу запустить ProcessBuilder или Runtime Exec. Моя установка - tomcat 9 с jdk 14 и windows 10. - person Mo Alex; 29.06.2020
comment
Я все еще не могу воссоздать вашу проблему. Я думаю, что для меня имеет смысл удалить свой ответ, поскольку он не имеет отношения к вашей проблеме. - person andrewjames; 01.07.2020
comment
Я воспроизвел свою проблему на tomcat 7 и 9. Таким образом, я до сих пор не могу сказать, в чем проблема. Можете ли вы посоветовать, как вы запустили tomcat? Как служба Windows? - person Mo Alex; 01.07.2020
comment
Я добавил несколько примечаний к моему ответу здесь. - person andrewjames; 01.07.2020