Я ищу какой-нибудь «стабильный» метод для преобразования файла DOCX из MS WORD в PDF. С тех пор я использую OpenOffice, установленный в качестве слушателя, но он часто зависает. Проблема в том, что у нас бывают ситуации, когда многие пользователи хотят конвертировать файлы SXW, DOCX в PDF одновременно. Есть ли другая возможность? Я пробовал использовать примеры с этого сайта: https://angelozerr.wordpress.com/2012/12/06/how-to-convert-docxodt-to-pdfhtml-with-java/, но результат не очень хороший (преобразованные документы есть ошибки и макет сильно изменен).
вот «исходный» документ docx:
вот документ, преобразованный с помощью docx4j с некоторым текстом исключения внутри документа. Также отсутствует текст в правом верхнем углу.
this один — PDF, созданный с помощью OpenOffice в качестве конвертера из docx в pdf. В каком-то тексте отсутствует «верхний правый угол»
Есть ли какой-то другой вариант для преобразования docx в pdf с помощью Java?
Есть много методов для преобразования. Один из используемых методов — использование POI и DOCX4j
InputStream - это = новый FileInputStream (новый файл ("ваш Docx PAth")); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load (есть); Список разделов = wordMLPackage.getDocumentModel (). GetSections (); для (int я = 0; я
loggers = Collections. list (LogManager .getCurrentLoggers ()); loggers.add (LogManager.getRootLogger ()); для (Регистратор регистратор: регистраторы) {logger.setLevel (Level.OFF); } OutputStream out = новый FileOutputStream (новый файл («Ваш путь к OutPut PDF»)); convert.output (выход, pdfSettings); System.out.println («ВЫПОЛНЕНО !!»);
Это отлично работает и даже пробовалось с несколькими файлами DOCX.
15
Преобразование docx в pdf на java
Я пытаюсь преобразовать файл
docx
, содержащий таблицу и изображения, в Файл формата pdf
.
Я искал везде, но не нашел подходящего решения, просьба дать правильное и правильное решение:
вот что я пробовал:
import java.io.File; import java.io. FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.poi.xwpf.converter.pdf. PdfConverter; import org.apache.poi.xwpf.converter.pdf.PdfOptions; import org.apache.poi.xwpf.usermodel.XWPFDocument; открытый класс TestCon {public static void main (String [] args) {TestCon cwoWord = new TestCon (); System.out.println («Пуск»); cwoWord.ConvertToPDF ("D: \ Test.docx", "D: \ Test1.pdf"); } public void ConvertToPDF (String docPath, String pdfPath) {попробуйте {InputStream doc = new FileInputStream (новый файл (docPath)); XWPFDocument document = новый XWPFDocument (doc); Параметры PdfOptions = PdfOptions.create (); OutputStream out = новый FileOutputStream (новый файл (pdfPath)); PdfConverter.getInstance (). Convert (документ, выход, параметры); System.out.println («Готово»); } catch (FileNotFoundException ex) {System.out.println (ex.getMessage ()); } catch (исключение IOException) {System.out.println (например, getMessage ()); }}}
Исключение:
Исключение в потоке «main» java.lang.IllegalAccessError: попытка доступа к методу org. apache.poi.util.POILogger.log (ILjava/lang/Object;) V из класса org.apache.poi.openxml4j.opc.PackageRelationshipCollection в org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parse3RelationsParseRelationsParse3elations.jpg ) по адресу org.apache.poi.openxml4j.opc.PackageRelationshipCollection. (PackageRelationshipCollection.java:162)at org.apache.poi.openxml4j.opc.PackageRelationshipCollection. (PackageRelationshipCollection. apache.poi.openxml4j.opc.PackagePart.loadRelationships (PackagePart.java:559) в org.apache.poi.openxml4j.opc.PackagePart. (PackagePart.java:112)at org.apache.poi.openxml4j. opc.PackagePart. (PackagePart.java:83)at org.apache.poi.openxml4j.opc.PackagePart. (PackagePart.java:128)at org.apache.poi.openxml4j.opc.ZipPackagePart. (ZipPackagePart.java:78)at org.apache.poi.openxml4j.o pc.ZipPackage.getPartsImpl (ZipPackage.java:239) на org.apache.poi.openxml4j.opc.OPCPackage.getParts (OPCPackage.java:665) на org.apache.poi.openxml4j.opc.OPCPackage.open (OPCPackage.open. java: 274) в org.apache.poi.util.PackageHelper.open (PackageHelper.java:39) в org.apache.poi.xwpf.usermodel.XWPFDocument. (XWPFDocument.java:121)at test.TestCon .ConvertToPDF (TestCon.java:31) в test.TestCon.main (TestCon.java:25)
Мое требование — создать код java для преобразования существующего docx в pdf с правильный формат и выравнивание.
Пожалуйста, предложите.
Используемые банки:
Вам не хватает некоторых библиотек.
Я могу запустить ваш код, добавив следующие библиотеки:
Apache POI 3.15 org.apache.poi.xwpf.converter.core-1.0.6.jar org.apache.poi.xwpf.converter.pdf-1.0.6.jar fr .opensagres.xdocreport.itext. extension-2.0.0.jar itext-2.1.7.jar ooxml-schemas-1.3.jar
Я успешно преобразовал 6-страничный документ Word (.docx) с таблицами, изображениями и различными форматирование.
В дополнение к ответу VivekRatanSinha, я хотел бы опубликовать полный код и необходимые банки для люди, которым это понадобится в будущем.
Код:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.poi.xwpf.converter.pdf.PdfConverter; import org.apache.poi.xwpf.converter.pdf.PdfOptions; import org.apache.poi.xwpf.usermodel.XWPFDocument; открытый класс WordConvertPDF {public static void main (String [] args) {WordConvertPDF cwoWord = new WordConvertPDF (); cwoWord.ConvertToPDF ("D:/Test.docx", "D:/Test.pdf"); } public void ConvertToPDF (String docPath, String pdfPath) {попробуйте {InputStream doc = new FileInputStream (новый файл (docPath)); XWPFDocument document = новый XWPFDocument (doc); Параметры PdfOptions = PdfOptions.create (); OutputStream out = новый FileOutputStream (новый файл (pdfPath)); PdfConverter.getInstance (). Convert (документ, выход, параметры); } catch (исключение IOException) {System.out.println (например, getMessage ()); }}}
и JARS:
Наслаждайтесь 🙂
3
Я предоставлю 3 метода для преобразования docx в pdf:
- Использование itext и opensagres и apache poi
Код:
импорт java .io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import fr.opensagres.poi.xwpf.converter .pdf.PdfOptions; import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter; import org.apache.poi.xwpf.usermodel.XWPFDocument; открытый класс ConvertDocToPdfitext {public static void main (String [] args) {System. out.println («Запуск конвертации !!!»); ConvertDocToPdfitext cwoWord = новый ConvertDocToPdfitext (); cwoWord.ConvertToPDF ("C:/Users/avijit.shaw/Desktop/testing/docx/Account Opening Prototype Details.docx", "C:/Users/avijit.shaw/Desktop/testing/docx/Test-1.pdf" ); System.out.println ("Конвертация завершается !!!"); } public void ConvertToPDF (String docPath, String pdfPath) {попробуйте {InputStream doc = new FileInputStream (новый файл (docPath)); XWPFDocument document = новый XWPFDocument (doc); Параметры PdfOptions = PdfOptions.create (); OutputStream out = новый FileOutputStream (новый файл (pdfPath)); PdfConverter.getInstance (). Convert (документ, выход, параметры); } catch (исключение IOException) {System.out.println (например, getMessage ()); }}}
Зависимости: используйте Maven для разрешения зависимостей.
Новая версия 2.0.2 fr.opensagres.poi.xwpf.converter.core работает с apache poi 4.0.1 и itext 2.17. Вам просто нужно добавить ниже зависимость в Maven, и тогда maven автоматически загрузит все зависимые зависимости. (Обновлен ваш проект Maven, поэтому он загрузил все эти библиотеки и все его зависимости)
fr.opensagres.xdocreport fr.opensagres.poi.xwpf.converter.pdf 2.0.2
- Использование Documents4j
Примечание. На компьютере, на котором выполняется этот код, должен быть установлен MS Office.
Код:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io. InputStream; import java.io.OutputStream; import com.documents4j.api.DocumentType; import com.documents4j.api.IConverter; import com.documents4j.job.LocalConverter; public class Document4jApp {public static void main (String [] args) {Файл inputWord = новый файл ("C:/Users/avijit.shaw/Desktop/testing/docx/Account Opening Prototype Details.docx"); Файл outputFile = новый файл ("Test_out.pdf"); попробуйте {InputStream docxInputStream = новый FileInputStream (inputWord); OutputStream outputStream = новый FileOutputStream (outputFile); Конвертер IConverter = LocalConverter.builder (). Build (); Converter.convert (docxInputStream) .as (DocumentType.DOCX) .to (outputStream) .as (DocumentType.PDF) .execute (); outputStream.close (); System.out.println («успех»); } catch (исключение e) {e.printStackTrace (); }}}
Зависимости: используйте Maven для разрешения зависимостей.
com.documents4j documents4j-local 1.0.3 com.documents4j documents4j-transformer-msoffice-word 1.0.3
- Использование openoffice nuoil
Примечание. OpenOffice должен быть установлен на компьютере, на котором выполняется этот код. Код:
import java.io.File; import com.sun.star.beans.PropertyValue; import com.sun.star.comp.helper.BootstrapException; import com.sun.star.frame .XComponentLoader; import com.sun.star.frame.XDesktop; import com.sun.star.frame.XStorable; import com.sun.star.lang.XComponent; import com.sun.star.lang.XMultiComponentFactory; import com. sun.star.uno.Exception; импорт com.sun.star.uno.UnoRuntime; импорт com.sun.star.uno.XComponentConte xt; import ooo.connector.BootstrapSocketConnector; общедоступный класс App {public static void main (String [] args) выдает исключение, BootstrapException {System.out. println ("Заявление о преобразовании !!!"); //Инициализируем строку oooExeFolder = "C: \ Program Files (x86) \ OpenOffice 4 \ program"; //Укажите путь, по которому установлен OpenOffice XComponentContext xContext = BootstrapSocketConnector.bootstrap (oooExeFolder); XMultiComponentFactory xMCF = xContext.getServiceManager (); Объект oDesktop = xMCF.createInstanceWithContext ("com.sun.star.frame.Desktop", xContext); XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface (XDesktop.class, oDesktop); //Загружаем строку документа workingDir = "C:/Users/avijit.shaw/Desktop/testing/docx/"; //Предоставляем путь к каталогу файла docx для преобразования String myTemplate = workingDir + "Account Opening Prototype Details.docx"; //Имя файла docx для преобразования if (! New File (myTemplate) .canRead ()) {throw new RuntimeException ("Cannot load template:" + new File (myTemplate)); } XComponentLoader xCompLoader = (XComponentLoader) UnoRuntime .queryInterface (com.sun.star.frame.XComponentLoader.class, xDesktop); Строка sUrl = "файл:///" + myTemplate; PropertyValue [] propertyValues = новое PropertyValue [0]; propertyValues = новое PropertyValue [1]; propertyValues [0] = новое PropertyValue (); propertyValues [0] .Name = "Скрытый"; propertyValues [0] .Value = new Boolean (true); XComponent xComp = xCompLoader.loadComponentFromURL (sUrl, "_blank", 0, propertyValues); //сохранить как PDF-файл XStorable xStorable = (XStorable) UnoRuntime.queryInterface (XStorable.class, xComp); propertyValues = новое PropertyValue [2]; //Установка флага перезаписи propertyValues [0] = new PropertyValue (); propertyValues [0] .Name = "Перезаписать"; propertyValues [0] .Value = new Boolean (true); //Установка имени фильтра propertyValues [1] = new PropertyValue (); propertyValues [1] .Name = "Имя фильтра"; propertyValues [1] .Value = "writer_pdf_Export"; //Добавление предпочтительного расширения к имени исходного документа String myResult = workingDir + "letterOutput.pdf"; //Имя PDF-файла для вывода xStorable.storeToURL ("file:///" + myResult, propertyValues); System.out.println («Сохранено» + myResult); //завершение работы xDesktop.terminate (); }}
Зависимости: используйте Maven для разрешения зависимостей.
org.openoffice unoil 3.2.1 org.openoffice juh 3.2 .1 org.openoffice загрузочный соединитель 0.1. 1
2
Я провел много исследований и обнаружил, что Documents4j — лучший бесплатный API для преобразования docx в pdf. Alignment , font all documents4j отлично справляется.
Зависимости Maven:
com.documents4j documents4j-local 1.0.3 com.documents4j documents4j-transformer-msoffice-word 1.0.3
Используйте приведенный ниже код для преобразования docx в pdf.
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io .OutputStream; import com.documents4j.api.DocumentType; import com.documents4j.api.IConverter; import com.documents4j.job.LocalConverter; открытый класс Document4jApp {public static void main (String [] args) {File inputWord = new File ("Tests.docx"); Файл outputFile = новый файл ("Test_out.pdf"); попробуйте {InputStream docxInputStream = новый FileInputStream (inputWord); OutputStream outputStream = новый FileOutputStream (outputFile); Конвертер IConverter = LocalConverter.builder (). Build (); Converter.convert (docxInputStream) .as (DocumentType.DOCX) .to (outputStream) .as (DocumentType.PDF) .execute (); outputStream.close (); System.out.println («успех»); } catch (исключение e) {e.printStackTrace (); }}}
3
Если ваш документ довольно богат и вы можете выполнить преобразование в Linux/Unix, тогда реализация всех трех основных параметров, предложенных в потоке, может быть «немного» болезненной.
Решение, которое я могу предложить, — использовать Gotenberg: API без сохранения состояния на базе Docker для преобразования документов HTML, Markdown и Office в PDF.
- запустить контейнер
$ docker run --rm -p 3000: 3000 thecodingmachine/gotenberg: 6
- сделать запрос к контейнеру. Вот как использовать
curl
:
$ curl --request POST --url http://localhost: 3000 /convert/office --header 'Content-Type: multipart/form-data' --form files=@document.docx --form files=@document2.docx -o result.pdf
Разверните его в своей инфраструктуре (например, как отдельный микросервис) и отправьте его из службы Java, выполнив этот простой HTTP-запрос. Получите свой PDF-файл в ответ и делайте с ним что хотите.
Протестировано, отлично работает!
Вам необходимо добавить эти зависимости maven
org.apache.poi poi 4.0.1 org.apache.poi poi-ooxml 4.0. 1 org.apache.poi poi-scratchpad 4.0.1 org.apache.poi poi-ooxml-schemas 4.0.1 org.apache.poi poi-excelant 4.0.1 org.apache.poi poi-examples 4.0.1 fr.opensagres.xdocreport org.apache.poi.xwpf.converter.core 1.0.6 fr.opensagres.xdocreport org.apache.poi.xwpf.converter.pdf 1.0.6
Я использую этот код.
закрытый байт [] toPdf (ByteArrayOutputStream docx) {InputStream isFromFirstData = new ByteArrayInputStream (docx.toByteArray ()); XWPFDocument document = новый XWPFDocument (isFromFirstData); Параметры PdfOptions = PdfOptions.create (); //создаем новый файл в c: temp OutputStream out = new FileOutputStream (new File ("c: \ tmp \ HelloWord.pdf")); PdfConverter.getInstance (). Convert (документ, выход, параметры); //возвращаем байтовый массив для возврата в http-запросе. ByteArrayOutputStream pdf = новый ByteArrayOutputStream (); PdfConverter.getInstance (). Convert (документ, pdf, параметры); document.write (pdf); document.close (); return pdf.toByteArray ();}
Только ОДНА зависимость должна быть добавлена вручную (остальные должны быть добавлены автоматически). На данный момент последняя версия — 2.0.2.
Gradle:
dependencies {//То, что у вас уже должно быть реализация "org .apache.poi: poi-ooxml: latest.release "//ДОБАВИТЬ НИЖНУЮ СТРОКУ В БЛОК ЗАВИСИМОСТИ В сборке. реализация gradle 'fr.opensagres.xdocreport: fr.opensagres.poi.xwpf.converter.pdf: 2.0.2'}
Только Maven:
fr.opensagres.xdocreport fr.opensagres.poi.xwpf.converter.pdf 2.0.2