2010-03-22 13 views
7

Necesito escribir una aplicación java que pueda combinar archivos docx. ¿Alguna sugerencia?¿Hay alguna biblioteca java (quizás poi?) Que permita fusionar archivos docx?

+0

Al "fusionar", ¿te refieres a algún tipo de concatenación simple? ¿O algo más elegante? ¿La dificultad es la parte de fusión o la parte docx (en lugar de doc)? –

+0

Merge debería dar el mismo resultado que si abriéramos manualmente en el primer documento de MS Office, presione Ctrl + C, luego abra el segundo documento, vaya a su final y presione Ctrl + V. – Roman

Respuesta

5

Las siguientes son las API de Java disponible para manejar documentos de MS Word OpenXML con Java:

Hubo uno más, pero ya no recuerdo el nombre.

En cuanto a su requisito funcional: fusionar dos documentos es técnicamente complicado para lograr el resultado que el usuario final esperaría. La mayoría de las API no permitirán eso. Necesitará extraer la información deseada de dos documentos y luego crear un documento nuevo basado en esta información usted mismo.

+0

¿Cómo decides qué usar? Estoy entre Apache POI y OpenOffice.org. El segundo requeriría instalar una oficina abierta, que creo que sería un éxito en el rendimiento, ¿es cierto? – Roger

+0

Para obtener más información sobre por qué es técnicamente complicado, consulte http://www.docx4java.org/blog/2010/11/merging-word-documents/ – JasonPlutext

+0

. Supongo que la mejor manera de decidir cuál usar es probarlos con su documentos. Puede probar una herramienta comercial basada en docx4j, en http://webapp.docx4java.org/OnlineDemo/forms/upload_MergeDocx.xhtml – JasonPlutext

1

Aspose API es la mejor hasta el momento para fusionar archivos word doc o docx hasta el momento, pero no es gratuito ni de código abierto, si necesita una herramienta gratuita y de código abierto hay un par de API que puede elegir, puede encontrar un comentario para ellos aquí,

http://www.esupu.com/open-source-office-document-java-api-review/

+0

enlace roto .... – paul

11

Con PDI mi solución es:

public static void merge(InputStream src1, InputStream src2, OutputStream dest) throws Exception { 
    OPCPackage src1Package = OPCPackage.open(src1); 
    OPCPackage src2Package = OPCPackage.open(src2); 
    XWPFDocument src1Document = new XWPFDocument(src1Package);   
    CTBody src1Body = src1Document.getDocument().getBody(); 
    XWPFDocument src2Document = new XWPFDocument(src2Package); 
    CTBody src2Body = src2Document.getDocument().getBody();   
    appendBody(src1Body, src2Body); 
    src1Document.write(dest); 
} 

private static void appendBody(CTBody src, CTBody append) throws Exception { 
    XmlOptions optionsOuter = new XmlOptions(); 
    optionsOuter.setSaveOuter(); 
    String appendString = append.xmlText(optionsOuter); 
    String srcString = src.xmlText(); 
    String prefix = srcString.substring(0,srcString.indexOf(">")+1); 
    String mainPart = srcString.substring(srcString.indexOf(">")+1,srcString.lastIndexOf("<")); 
    String sufix = srcString.substring(srcString.lastIndexOf("<")); 
    String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<")); 
    CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix); 
    src.set(makeBody); 
} 

Con docx4j mi solución es:

public class MergeDocx { 
    private static long chunk = 0; 
    private static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 

    public void mergeDocx(InputStream s1, InputStream s2, OutputStream os) throws Exception { 
     WordprocessingMLPackage target = WordprocessingMLPackage.load(s1); 
     insertDocx(target.getMainDocumentPart(), IOUtils.toByteArray(s2)); 
     SaveToZipFile saver = new SaveToZipFile(target); 
     saver.save(os); 
    } 

    private static void insertDocx(MainDocumentPart main, byte[] bytes) throws Exception { 
      AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(new PartName("/part" + (chunk++) + ".docx")); 
      afiPart.setContentType(new ContentType(CONTENT_TYPE)); 
      afiPart.setBinaryData(bytes); 
      Relationship altChunkRel = main.addTargetPart(afiPart); 

      CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk(); 
      chunk.setId(altChunkRel.getId()); 

      main.addObject(chunk); 
    } 
} 
+0

gracias por esta respuesta, su código Poi funciona para mí, pero en mi caso también necesito unir archivos .doc así que tengo que usar el org.apache.poi.hwpf.HWPFDocument. Entonces, al seguir tu código docx, quiero obtener el formato xml del archivo .doc pero no encontré la manera de hacerlo. Cualquier idea será apreciada :) – AmiraGL

+0

Esto funcionó perfectamente. ¡Gracias! –

+0

@atott código de POI funcionó para mí, pero si anexar doc tiene imágenes, entonces después de que las imágenes de fusión no estén allí, descanse todo el texto fusionado con el formato exacto. –

Cuestiones relacionadas