使用JAVA中的Apache POI和iText从Word(DOC)创建PDF

我试图从* .doc文档生成PDF文档。 直到现在,感谢stackoverflow我已成功生成它但有一些问题。

我的示例代码生成的pdf没有格式和图像,只有文本。 该文档包括未包含在PDF中的空格和图像。

这是代码:

in = new FileInputStream(sourceFile.getAbsolutePath()); out = new FileOutputStream(outputFile); WordExtractor wd = new WordExtractor(in); String text = wd.getText(); Document pdf= new Document(PageSize.A4); PdfWriter.getInstance(pdf, out); pdf.open(); pdf.add(new Paragraph(text)); 

docx4j包含使用iText从docx创建PDF的代码 。 它还可以使用POI将doc转换为docx。

有一段时间我们平等地支持这两种方法(以及通过XHTML的PDF),但我们决定专注于XSL-FO。

如果它是一个选项,你最好使用docx4j通过XSL-FO和FOP将docx转换为PDF。

像这样使用它:

  wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath)); // Set up font mapper Mapper fontMapper = new IdentityPlusMapper(); wordMLPackage.setFontMapper(fontMapper); // Example of mapping missing font Algerian to installed font Comic Sans MS PhysicalFont font = PhysicalFonts.getPhysicalFonts().get("Comic Sans MS"); fontMapper.getFontMappings().put("Algerian", font); org.docx4j.convert.out.pdf.PdfConversion c = new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(wordMLPackage); // = new org.docx4j.convert.out.pdf.viaIText.Conversion(wordMLPackage); OutputStream os = new java.io.FileOutputStream(inputfilepath + ".pdf"); c.output(os); 

2016年7月更新

从docx4j 3.3.0开始,Plutext的商业PDF渲染器是docx4j的docx到PDF转换的默认选项。 您可以在converter-eval.plutext.com上尝试在线演示

如果要将现有docx用于XSL-FO到PDF(或Apache FOP支持的其他目标)方法,则只需将docx4j-export-FO jar添加到类路径中。

无论哪种方式,要将docx转换为PDF,您都可以使用Docx4J facade的toPDF方法。

通过iText代码的旧docx到PDF可以在https://github.com/plutext/docx4j-export-FO/…/docx4j-extras/PdfViaIText/找到

WordExtractor只抓取纯文本,没有别的。 这就是为什么你所看到的只是纯文本。

您需要做的是单独获取每个段落,然后抓取每个段落,获取格式,并生成PDF中的等效项。

一种选择可能是找到一些将XHTML转换为PDF的代码。 然后,使用Apache Tika将您的word文档转换为XHTML(它在引擎盖下使用POI,并为您处理所有格式化的东西),从XHTML转换为PDF。

否则,如果您打算自己动手,请查看Apache Tika中的代码来解析word文件。 这是如何获得图像,格式,样式等的一个非常好的例子。

我成功地使用Apache FOP将’WordML’文档转换为PDF。 WordML是将Word文档另存为xml的Office 2003方法。 可以在Web上找到XSLT样式表,将此xml转换为xml-fo,而xml-fo又可以通过FOP呈现为PDF(以及其他输出)。

它与提供的解决方案plutext没有什么不同,只是它不读取.doc文档,而docx4j显然是这样。 如果您的要求足够灵活,可以将WordML样式文档作为输入,那么这可能值得研究。

祝你的项目好运! 维姆

使用OpenOffice / LbreOffice和JODConnector这也主要适用于.doc到.docx。 我尚未解决的图形问题。

  private static void transformDocXToPDFUsingJOD(File in, File out) { OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); DocumentFormat pdf = converter.getFormatRegistry().getFormatByExtension("pdf"); converter.convert(in, out, pdf); } private static OfficeManager officeManager; @BeforeClass public static void setupStatic() throws IOException { /*officeManager = new DefaultOfficeManagerConfiguration() .setOfficeHome("C:/Program Files/LibreOffice 3.6") .buildOfficeManager(); */ officeManager = new ExternalOfficeManagerConfiguration().setConnectOnStart(true).setPortNumber(8100).buildOfficeManager(); officeManager.start(); } @AfterClass public static void shutdownStatic() throws IOException { officeManager.stop(); } 

你需要运行LibreOffice作为一个serverto使这项工作。 从命令行,您可以使用;

 "C:\Program Files\LibreOffice 3.6\program\soffice.exe" -accept="socket,host=0.0.0.0,port=8100;urp;LibreOffice.ServiceManager" -headless -nodefault -nofirststartwizard -nolockcheck -nologo -norestore 

我最近遇到的另一个选择是使用OpenOffice(或LibreOffice)API( 参见此处 )。 我无法进入这个,但它应该能够以各种格式打开文档并以pdf格式输出。 如果您对此进行调查,请告诉我它是如何工作的!