2010-03-22 7 views
7

Ho bisogno di scrivere un'applicazione java in grado di unire file docx. Eventuali suggerimenti?C'è qualche libreria java (forse poi?) Che consente di unire file docx?

+0

Per "unione", intendi qualche tipo di concatenazione? O qualcosa di più elaborato? La difficoltà è di unire parte o parte docx (piuttosto che doc)? –

+0

Merge dovrebbe dare lo stesso risultato come se aprissimo manualmente nel primo documento di MS Office, premi Ctrl + C, quindi apri il secondo documento, vai alla sua fine e premi Ctrl + V. – Roman

risposta

5

Le seguenti API Java sono disponibili per gestire documenti MS Word OpenXML con Java:

C'era uno di più, ma non mi ricordo più il nome.

Per quanto riguarda il vostro requisito funzionale: unire due documenti è tecnicamente difficile per ottenere il risultato come si aspetterebbe l'utente finale. La maggior parte delle API non lo consentirà. Dovrai estrarre le informazioni desiderate da due documenti e quindi creare un nuovo documento basato su queste informazioni tu stesso.

+0

Come decidi quale usare? Sono tra Apache POI e OpenOffice.org. Il secondo richiederebbe l'installazione di un ufficio aperto che penso sarebbe un successo nella performance, è vero? – Roger

+0

Per ulteriori informazioni sul perché è complicato dal punto di vista tecnico, vedi http://www.docx4java.org/blog/2010/11/merging-word-documents/ – JasonPlutext

+0

Immagino che il modo migliore per decidere quale usare è provarli con il tuo documenti. Si può provare uno strumento commerciale basata su docx4j, a http://webapp.docx4java.org/OnlineDemo/forms/upload_MergeDocx.xhtml – JasonPlutext

1

Aspose API è il migliore finora per la fusione dei file word doc o docx finora ma non è gratuito o open source, se hai bisogno di strumenti gratuiti e open source ci sono un paio di API tra cui puoi scegliere, puoi trovare una recensione su di loro qui,

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

+0

collegamento interrotto .... – paul

11

Con POI la mia soluzione è:

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 la mia soluzione è:

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

grazie per questa risposta il tuo codice di Poi funziona per me, ma nel mio caso ho bisogno anche di unire file .doc così devo usare il file org.apache.poi.hwpf.HWPFDocument. Quindi, seguendo il tuo codice docx, voglio ottenere il formato xml dal file .doc ma non ho trovato il modo di farlo. Qualsiasi idea sarà apprezzata :) – AmiraGL

+0

Questo ha funzionato perfettamente. Grazie! –

+0

@atott Il codice POI ha funzionato per me ma se append doc ha immagini, allora dopo aver unito le immagini non ci sono, tutto il testo si fonde con la formattazione esatta. –