Преобразование DOCX в PDF с помощью document4j (который для преобразования внутри использует VBScript)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Преобразование DOCX в PDF с помощью document4j (который для преобразования внутри использует VBScript)

Сообщение Anonymous »


Ниже приведен простой фрагмент кода, который я пытаюсь использовать для преобразования файла DOCX в PDF в моей локальной системе, который взят из http://documents4j.com/#/. [*]Запуск этого фрагмента кода как части службы внутри веб-приложения (.war), развернутого на Tomcat 9.0.37, которое работает как служба Windows. [*]Создана следующая папка C:\Windows\SysWOW64\config\systemprofile\Desktop (Запуск приложения document4j в качестве службы Windows). [*]Установлен MS Office Professional 2016 (лицензионная копия). Ну, с той же конфигурацией на VM 1: Windows Server 2012 и VM 2: Windows Server 2019, как указано в трех пунктах выше. Я могу преобразовать DOCX в PDF на своей VM 1: Windows server 2012. Но с проблемой, с которой я столкнулся ниже, я столкнулся в VM 2: Windows server 2019.

При вызове метода выполнения текущий поток блокируется навсегда, что приводит к утечке памяти. Найдите приведенную ниже ошибку в методе выполнения.

org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Веб-приложение [appName] все еще обрабатывает запрос, который еще не завершен. Очень вероятно, что это приведет к утечке памяти. Вы можете контролировать время, отведенное для завершения запросов, с помощью атрибута unloadDelay стандартной реализации контекста. Трассировка стека потока обработки запроса:[ java.base@11.0.5/jdk.internal.misc.Unsafe.park (собственный метод) java.base@11.0.5/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194) java.base@11.0.5/java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:885) java.base@11.0.5/java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptible(AbstractQueuedSynchronizer.java:1039) java.base@11.0.5/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptible(AbstractQueuedSynchronizer.java:1345) java.base@11.0.5/java.util.concurrent.CountDownLatch.await(CountDownLatch.java:232) com.documents4j.job.AbstractFutureWrappingPriorityFuture.get(AbstractFutureWrappingPriorityFuture.java:204) com.documents4j.job.AbstractFutureWrappingPriorityFuture.get(AbstractFutureWrappingPriorityFuture.java:10) com.documents4j.job.ConversionJobAdapter.execute(ConversionJobAdapter.java:13) Фрагмент кода 1:

import java.io.File; импортировать java.io.FileInputStream; импортировать java.io.FileOutputStream; импортировать java.io.InputStream; импортировать java.io.OutputStream; импортировать com.documents4j.api.DocumentType; импортировать com.documents4j.api.IConverter; импортировать com.documents4j.job.LocalConverter; общественный класс WordMLToPDF2 { public static void main(String[] args) { Файл inputWord = новый файл("C:\\Users\\anshu\\Downloads\\test.docx") , outputFile = новый файл("C:\\Users\\anshu\\Downloads\\test.pdf"); пытаться { InputStream docxInputStream = новый FileInputStream (inputWord); OutputStream outputStream = новый FileOutputStream (outputFile); Конвертер IConverter = LocalConverter.builder() .baseFolder(tmpDir) .workerPool(20, 25, 2, TimeUnit.SECONDS) .processTimeout(30, TimeUnit.SECONDS) .строить(); Converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute(); выходной поток.закрыть(); System.out.println("успех"); конвертер.shutDown(); } catch (Исключение е) { е.printStackTrace(); } } } Ниже зависимости, которые я настроил в pom.xml

org.docx4j docx4j-documents4j-local 8.3.3 org.docx4j docx4j-JAXB-ReferenceImpl 8.3.3 org.apache.logging.log4j log4j-slf4j-impl 2.17.1 jakarta.xml.bind jakarta.xml.bind-api 2.3.2 org.glassfish.jaxb JAXB-время выполнения 2.3.2 РЕДАКТИРОВАТЬ:

После анализа исходного кода. Я понял следующее:
[*]
Внутренне document4j выполняет VBScript с помощью другой библиотеки zt-exec (ZeroTurnaround Process Executor) для запуска WINWORD или для преобразования DOCX в PDF или для остановки WINWORD
[*]
Программа WINWORD зависает при выполнении wordApplication.Documents.Open(inputFile, False, True, False) word_convert
[*]
В приведенном выше операторе wordApplication содержит объект Word.Application

word_start word_convert word_shutdwon
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»