2011-05-19 303 views
6

我试图从* .doc文档生成PDF文档。 直到现在,并感谢stackoverflow我有成功生成它,但有一些问题。在JAVA中使用Apache POI和iText创建Word(DOC)中的PDF

我在下面的示例代码生成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)); 

回答

2

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

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

一个选项可能是找到一些将XHTML转换为PDF的代码。然后,使用Apache Tika将您的word文档转换为XHTML(它使用底层的POI,并为您处理所有格式化的东西),并从XHTML转换为PDF。否则,如果您要自己做,请查看Apache Tika中用于解析word文件的代码。这是如何获得图像,格式,样式等非常好的例子。

+0

我真的无法进入Tika项目来解析文字fils。了解解析Word文件的任何其他项目或者如何自行解析它的示例项目/说明。我只需要格式化和图片旁边的文字文件中的常规文字。 – Ismet 2011-05-24 15:52:35

+0

Tika应该很容易上手!只需抓住Tika CLI程序并将文件传递给它,就可以获得XHTML。对此感到满意,然后开始自己调用Java。 – Gagravarr 2011-05-25 11:38:11

11

docx4j包括code用于使用iText从docx创建PDF。它也可以使用POI将文档转换为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渲染器是DOCX转换为PDF docx4j的默认选项。您可以尝试在线演示converter-eval.plutext.com

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

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

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

1

发现我已成功使用的Apache FOP的“WordML中”文档转换为PDF。 WordML是将Word文档保存为xml的Office 2003方式。可以在Web上找到XSLT样式表,将这个xml转换为xml-fo,然后可以通过FOP将其转换为PDF(以及其他输出)。

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

祝您的项目顺利! Wim

0

我最近遇到的另一个选择是使用OpenOffice(或LibreOffice)API(see here)。我一直无法进入,但它应该能够打开各种格式的文件并以pdf格式输出。如果你看看这个,让我知道它是如何工作的!

1

使用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