2011-05-19 331 views
6

Estoy intentando generar un documento PDF a partir de un documento * .doc. Hasta ahora y gracias a stackoverflow tengo éxito generando pero con algunos problemas.Crear PDF desde Word (DOC) utilizando Apache POI e iText en JAVA

Mi código de ejemplo a continuación genera el pdf sin formataciones e imágenes, solo el texto. El documento incluye espacios en blanco e imágenes que no están incluidos en el PDF.

Aquí está el código:

 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)); 

Respuesta

2

WordExtractor simplemente agarra el texto sin formato, nada más. Es por eso que todo lo que estás viendo es el texto sin formato.

Lo que tendrá que hacer es obtener cada párrafo individualmente, luego tomar cada ejecución, obtener el formato y generar el equivalente en PDF.

Una opción puede ser encontrar algún código que convierta a XHTML en un PDF. Luego, use Apache Tika para convertir su documento de Word en XHTML (usa POI debajo del capó y maneja todo el material de formateo) y del XHTML en PDF.

De lo contrario, si va a hacerlo usted mismo, eche un vistazo al código en Apache Tika para analizar archivos de palabras. Es un gran ejemplo de cómo llegar a las imágenes, el formato, los estilos, etc.

+0

No pude entrar en el proyecto Tika para analizar la palabra fils. Conozca cualquier otro proyecto para analizar el archivo de palabras o un ejemplo de proyecto/descripción cómo analizarlo usted mismo. Solo necesito formación e imágenes junto al texto normal en el archivo de palabras. – Ismet

+0

¡Tika debería ser muy fácil de empezar! Simplemente toma el programa CLI de Tika y pasa el archivo de palabras a él, y obtendrás XHTML. Siéntase feliz con eso, luego comience a llamar a Java usted mismo. – Gagravarr

11

docx4j incluye code para crear un PDF a partir de un docx usando iText. También puede usar POI para convertir un documento a docx.

Hubo un momento en que apoyamos ambos métodos por igual (así como PDF a través de XHTML), pero decidimos centrarnos en XSL-FO.

Si es una opción, sería mucho mejor usar docx4j para convertir un docx a PDF a través de XSL-FO y FOP.

usarlo como así:

 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); 

Update Julio el año 2016

A partir de docx4j 3.3.0, PDF procesador comercial de Plutext es la opción por defecto de docx4j de docx a la conversión de PDF. Puede probar una demostración en línea en converter-eval.plutext.com

Si desea utilizar el docx existente para XSL-FO a PDF (u otro objetivo compatible con Apache FOP), simplemente agregue el jar docx4j-export-FO a su classpath .

De cualquier forma, para convertir docx a PDF, puede usar el método toPDF de la fachada Docx4J.

El viejo docx a PDF a través de código iText se puede encontrar en https://github.com/plutext/docx4j-export-FO/.../docx4j-extras/PdfViaIText/

1

he utilizado con éxito Apache FOP de convertir el documento un 'WordML' a PDF. WordML es la forma de Office 2003 de guardar un documento de Word como xml. Las hojas de estilo XSLT se pueden encontrar en la web para transformar este xml en xml-fo, que a su vez puede ser renderizado por FOP en PDF (entre otras salidas).

No es tan diferente del plutext de solución ofrecido, excepto que no lee un documento .doc, mientras que docx4j aparentemente sí. Si sus requisitos son lo suficientemente flexibles como para tener documentos de estilo WordML como entrada, podría valer la pena examinarlos.

¡Buena suerte con su proyecto! Wim

0

Otra opción que encontré recientemente es usar la API de OpenOffice (o LibreOffice) (see here). No he podido entrar en esto pero debería ser capaz de abrir documentos en varios formatos y darles salida en formato pdf. Si miran esto, háganme saber cómo funcionó.

1

Utilice OpenOffice/LbreOffice y JODConnector Esto también funciona principalmente para .doc a .docx. Problemas con los gráficos que aún no he resuelto.

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(); 
} 

Debe ejecutar LibreOffice como servicio para que esto funcione. Desde la línea de comandos puede hacer esto usando;

"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 
Cuestiones relacionadas