使用Java将docx文件转换为PDF

7
我正在寻找一种“稳定”的方法将 MS WORD 中的 DOCX 文件转换为 PDF。到目前为止,我使用已安装为监听器的 OpenOffice,但它经常挂起。问题在于我们有时会出现多个用户同时将 SXW、DOCX 文件转换为 PDF 的情况。还有其他可能性吗?我尝试了来自此网站的示例,但输出结果不好(转换后的文档存在错误,布局也相当改变)。
这里是“源”docx文档:enter image description here 这是使用 docx4j 转换的文档,其中包含一些异常文本。右上角的文本也丢失了:enter image description here 这是使用 OpenOffice 作为从 docx 到 pdf 的转换器创建的 PDF。一些文本丢失了“右上角”:enter image description here 还有其他使用 Java 将 docx 转换为 pdf 的选项吗?

不在SO上;当你想要“推荐一个工具或库”时 - 但为什么不尝试让你的OpenOffice设置稳定呢? - Stefan Hegny
你可以使用JODConverter(https://code.google.com/archive/p/jodconverter/)或docx4j(http://www.docx4java.org/trac/docx4j) - Davide
JODConverter 在后台使用 OpenOffice。问题在于,OpenOffice 有时会无缘无故地挂起(崩溃)。我也尝试过 docx4j(请看我的问题)。 - Ferguson
那是一篇四年前的文章。如今,从docx4j推荐的方法是使用Plutext的商业PDF转换器。您可以在http://converter-eval.plutext.com/上在线尝试。 - JasonPlutext
1个回答

4

有很多种方法可以进行转换,其中一种常用的方法是使用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不在类路径中java.lang.NoClassDefFoundError: org/apache/batik/bridge/UserAgent at org.apache.fop.image.loader.batik.PreloaderSVG.preloadImage(PreloaderSVG.java:69) - Ferguson
1
//关闭日志记录器 List<Logger> loggers = Collections.<Logger> list(LogManager .getCurrentLoggers()); loggers.add(LogManager.getRootLogger()); for (Logger logger : loggers) { logger.setLevel(Level.OFF); } 这将关闭这些消息的记录 - KishanCS
尝试删除日志,但PDF文档中缺少文本(右上角)、页脚等... - Ferguson
1
如果可能,请提供.docx文件。 - KishanCS
4
这个答案中的代码示例使用的是docx4j,而不是POI :-) - JasonPlutext
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接