2010-03-22 15 views
7

मुझे जावा एप्लिकेशन लिखना होगा जो डॉक्स फाइलों को मर्ज कर सकता है। कोई सुझाव?क्या कोई जावा लाइब्रेरी है (शायद poi?) जो docx फ़ाइलों को मर्ज करने की अनुमति देता है?

+0

"विलय" करके, क्या आपका मतलब कुछ सरल प्रकार का संयोजन है? या कुछ fancier? क्या मर्ज हिस्सा या डॉक्स (दस्तावेज़ के बजाए) भाग में कठिनाई है? –

+0

मर्ज को एक ही परिणाम देना चाहिए जैसे कि हम मैन्युअल रूप से एमएस ऑफिस में पहले दस्तावेज़ खोलते हैं, Ctrl + C दबाएं, फिर दूसरा दस्तावेज़ खोलें, इसके अंत में जाएं और Ctrl + V दबाएं। – Roman

उत्तर

5

निम्नलिखित जावा APIs जावा के साथ OpenXML एमएस वर्ड दस्तावेजों को संभालने के लिए उपलब्ध हैं:

एक और था, लेकिन मुझे अब नाम याद नहीं है।

आपकी कार्यात्मक आवश्यकता के अनुसार: दो दस्तावेज़ों को विलय करना परिणाम प्राप्त करने के लिए तकनीकी रूप से मुश्किल है क्योंकि एंड्यूसर अपेक्षा करेगा। अधिकांश एपीआई इसकी अनुमति नहीं देंगे। आपको वांछित जानकारी को दो दस्तावेज़ों से निकालने की आवश्यकता होगी और फिर इस जानकारी के आधार पर एक नया दस्तावेज़ बनाएं।

+0

आप कैसे तय करते हैं कि किस का उपयोग करना है? मैं अपाचे पीओआई और ओपनऑफिस.org के बीच हूं। दूसरे को खुले कार्यालय को स्थापित करने की आवश्यकता होगी जो मुझे लगता है कि यह प्रदर्शन में एक हिट होगा, क्या यह सच है? – Roger

+0

यह तकनीकी रूप से मुश्किल क्यों है, इसके लिए http://www.docx4java.org/blog/2010/11/merging-word-documents/ – JasonPlutext

+0

देखें मुझे लगता है कि इसका उपयोग करने का सबसे अच्छा तरीका है कि आप इसका उपयोग कैसे करें दस्तावेजों। आप http://webapp.docx4java.org/OnlineDemo/forms/upload_MergeDocx.xhtml – JasonPlutext

1

एसोसिएशन एपीआई अब तक शब्द डॉक या डॉक्क्स फाइलों को विलय करने के लिए सबसे अच्छा है लेकिन यह मुफ़्त या ओपन सोर्स नहीं है, अगर आपको एक फ्री और ओपन सोर्स टूल्स की ज़रूरत है तो आप कुछ एपीआई चुन सकते हैं, आप कर सकते हैं

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

+0

लिंक टूटा .... – paul

11

POI के साथ मेरी समाधान है, उन पर यहां एक समीक्षा लगता है:

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); 
} 
Docx4j मेरी समाधान के साथ

है:

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

इस उत्तर के लिए धन्यवाद आपका पोई कोड मेरे लिए काम करता है, लेकिन मेरे मामले में मुझे .doc फ़ाइलों को मर्ज करने की भी आवश्यकता है, इसलिए मुझे org.apache.poi.hwpf.HWPFDocument का उपयोग करना होगा। तो अपने डॉक्स कोड का पालन करके, मैं .doc फ़ाइल से xml प्रारूप प्राप्त करना चाहता हूं लेकिन मुझे ऐसा करने का कोई तरीका नहीं मिला। किसी भी विचार की सराहना की जाएगी :) – AmiraGL

+0

यह पूरी तरह से काम किया। धन्यवाद! –

+0

@atott POI कोड मेरे लिए काम करता है, लेकिन यदि दस्तावेज़ में संलग्न छवियां हैं, तो मर्ज छवियों के बाद वहां नहीं है, सभी पाठ सटीक स्वरूपण के साथ विलय करें। –

संबंधित मुद्दे

 संबंधित मुद्दे