2016-12-13 4 views
5

Я ищу некоторый «стабильный» способ конвертировать файл DOCX из MS WORD в PDF. С тех пор я использовал OpenOffice, установленный как слушатель, но он часто зависает. Проблема в том, что у нас есть ситуации, когда многие пользователи хотят конвертировать файлы SXW, DOCX в PDF одновременно. Есть ли другая возможность? Я пробовал с примерами с этого сайта: https://angelozerr.wordpress.com/2012/12/06/how-to-convert-docxodt-to-pdfhtml-with-java/, но результат результата не очень хорош (конвертированные документы имеют ошибки и макет довольно изменен).Преобразование файла docx в PDF с помощью Java

здесь «источник» DOCX документ: enter image description here

здесь документ, преобразованный с docx4j с текстом исключения внутри документа. Также отсутствует текст в верхнем правом углу.

enter image description here

это один PDF создан с OpenOffice как конвертер из DOCX в PDF. Некоторый текст отсутствует «в правом верхнем углу»

enter image description here

Есть ли какой-то другой вариант, чтобы преобразовать DOCX в PDF с Java?

+0

Не на SO; когда вы попросите «рекомендовать инструмент или библиотеку» - но почему бы просто не попытаться установить стабильную настройку openoffice? –

+0

Вы можете использовать JODConverter (https://code.google.com/archive/p/jodconverter/) или docx4j (http://www.docx4java.org/trac/docx4j) – Davide

+0

JODConverter использует OpenOffice в фоновом режиме. Проблема заключается в том, что OpenOffice иногда зависает (сбой) без каких-либо причин. Я также попробовал docx4j (посмотри на мой вопрос) – Ferguson

ответ

2

Есть много способов сделать преобразования Один из использованного метода состоит в использовании POI и docx4j

InputStream is = new FileInputStream(new File("your Docx PAth")); 
      WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage 
        .load(is); 
      List sections = wordMLPackage.getDocumentModel().getSections(); 
      for (int i = 0; i < sections.size(); i++) { 
       wordMLPackage.getDocumentModel().getSections().get(i) 
         .getPageDimensions(); 
      } 
      Mapper fontMapper = new IdentityPlusMapper(); 
      PhysicalFont font = PhysicalFonts.getPhysicalFonts().get(
        "Comic Sans MS");//set your desired font 
      fontMapper.getFontMappings().put("Algerian", font); 
      wordMLPackage.setFontMapper(fontMapper); 
      PdfSettings pdfSettings = new PdfSettings(); 
      org.docx4j.convert.out.pdf.PdfConversion conversion = new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(
        wordMLPackage); 
      //To turn off logger 
      List<Logger> loggers = Collections.<Logger> list(LogManager 
        .getCurrentLoggers()); 
      loggers.add(LogManager.getRootLogger()); 
      for (Logger logger : loggers) { 
       logger.setLevel(Level.OFF); 
      } 
      OutputStream out = new FileOutputStream(new File("Your OutPut PDF path")); 
      conversion.output(out, pdfSettings); 
      System.out.println("DONE!!"); 

Это отлично работает и даже примерил несколько файлов DOCX.

+1

Пробовал с помощью вашего метода, но, тем не менее, получил какое-то исключение: WARN org.apache.fop.image.loader.batik.PreloaderSVG .preloadImage line 76 - Batik not в классе пути java.lang.NoClassDefFoundError: орг/Apache/батик/мост/UserAgent \t в org.apache.fop.image.loader.batik.PreloaderSVG.preloadImage (PreloaderSVG.java:69) – Ferguson

+0

импорта org.apache. log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.docx4j.convert.out.pdf.viaXSLFO.PdfSettings; import org.docx4j.fonts.IdentityPlusMapper; import org.docx4j.fonts.Mapper; import org.docx4j.fonts.PhysicalFont; import org.docx4j.fonts.PhysicalFonts; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; –

+0

это обязательные –