Преобразование файла docx в PDF с помощью Java

Я ищу какой-нибудь «стабильный» метод для преобразования файла 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:

  1. Использование 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 
  1. Использование 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 
  1. Использование 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    

Оцените статью
clickpad.ru
Добавить комментарий