Page 1 of 1

How to embed a docx in another docx

PostPosted: Sat Dec 08, 2012 5:11 am
by cdharma
Hi

I wish to embed/insert a docx in to another docx . below is the code i have written ;

Code: Select all
    public static Object insertOLE(WordprocessingMLPackage wordMLPackage) throws Exception
    {
       wordMLPackage.getContentTypeManager().addDefaultContentType("bin", ContentTypes.WORDPROCESSINGML_DOCUMENT);

       File file = new File("c:\\temp\\image1.emf" );
       java.io.InputStream is = new java.io.FileInputStream(file);
       long length = file.length();   
       
       if (length > Integer.MAX_VALUE) {
          System.out.println("File too large!!");
       }
       byte[] bytes = new byte[(int)length];
       int offset = 0;
       int numRead = 0;
       while (offset < bytes.length
             && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
          offset += numRead;
       }
       
       if (offset < bytes.length) {
          System.out.println("Could not completely read file "+file.getName());
       }
       
       is.close();
       BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);     
       Relationship relImageObject = wordMLPackage.getMainDocumentPart().addTargetPart(imagePart);
                   
       Part olePart = new OleObjectBinaryPart();
             
       FileInputStream oleFile = new FileInputStream("c:/temp/2.docx");

       ((BinaryPart)olePart).setBinaryData(oleFile);
       ((OleObjectBinaryPart)olePart).initPOIFSFileSystem();
       ((OleObjectBinaryPart)olePart).writePOIFSFileSystem();                   
       //((OleObjectBinaryPart)olePart).viewFile(true);
             
       Relationship relOleObject = wordMLPackage.getMainDocumentPart().addTargetPart(olePart);
       
       String ml = "<w:p w:rsidR=\"0079557B\" w:rsidRDefault=\"0013129D\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
             "xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" " +
             "xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " +
             "xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">" +
             "<w:r>" +
             "<w:object w:dxaOrig=\"10485\" w:dyaOrig=\"4119\">" +
             "<v:shapetype id=\"_x0000_t75\" coordsize=\"21600,21600\" o:spt=\"75\" o:preferrelative=\"t\" path=\"m@4@5l@4@11@9@11@9@5xe\" filled=\"f\" stroked=\"f\">" +
             "<v:stroke joinstyle=\"miter\"/>" +
             "<v:formulas>" +
             "<v:f eqn=\"if lineDrawn pixelLineWidth 0\"/>" +
             "<v:f eqn=\"sum @0 1 0\"/><v:f eqn=\"sum 0 0 @1\"/>" +
             "<v:f eqn=\"prod @2 1 2\"/>" +
             "<v:f eqn=\"prod @3 21600 pixelWidth\"/>" +
             "<v:f eqn=\"prod @3 21600 pixelHeight\"/>" +
             "<v:f eqn=\"sum @0 0 1\"/>" +
             "<v:f eqn=\"prod @6 1 2\"/>" +
             "<v:f eqn=\"prod @7 21600 pixelWidth\"/>" +
             "<v:f eqn=\"sum @8 21600 0\"/>" +
             "<v:f eqn=\"prod @7 21600 pixelHeight\"/>" +
             "<v:f eqn=\"sum @10 21600 0\"/>" +
             "</v:formulas>" +
             "<v:path o:extrusionok=\"f\" gradientshapeok=\"t\" o:connecttype=\"rect\"/>" +
             "<o:lock v:ext=\"edit\" aspectratio=\"t\"/>" +
             "</v:shapetype>" +
             "<v:shape id=\"_x0000_i1025\" type=\"#_x0000_t75\" style=\"width:"+(imagePart.getImageInfo().getSize().getWidthPx())+"pt;height:"+(imagePart.getImageInfo().getSize().getHeightPx())+"pt\" o:ole=\"\">" +
             "<v:imagedata r:id=\"${ImageObjectRid}\" o:title=\"\"/>" +
             "</v:shape>" +
             "<o:OLEObject Type=\"Embed\" ProgID=\"Word.Document.12\" ShapeID=\"_x0000_i1025\" DrawAspect=\"Content\" ObjectID=\"_1355911853\" r:id=\"${OLEObjectRid}\"/>" +
             "</w:object>" +
             "</w:r>" +
             "</w:p>";
       HashMap<String, String> mappings = new HashMap<String, String>();   
       mappings.put("ImageObjectRid", relImageObject.getId());
       mappings.put("OLEObjectRid", relOleObject.getId());     
       return org.docx4j.XmlUtils.unmarshallFromTemplate(ml, mappings);     
    }


But i am getting the below exception :
Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML.
You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSS
F instead of HSSF)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:131)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:138)
at org.docx4j.openpackaging.parts.WordprocessingML.OleObjectBinaryPart.initPOIFSFileSystem(OleObjectBinaryPart.java:85)

I have all the below poi jars in my class path :
poi-3.9-20121203.jar
poi-examples-3.9-20121203.jar
poi-excelant-3.9-20121203.jar
poi-ooxml-3.9-20121203.jar
poi-ooxml-schemas-3.9-20121203.jar
poi-scratchpad-3.9-20121203.jar

Regards
Chetan

Re: How to embed a docx in another docx

PostPosted: Mon Dec 10, 2012 8:07 pm
by jason
When I embed a docx, using Word, I get:

Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
       <w:object w:dxaOrig="9026" w:dyaOrig="509">
          <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
            <v:stroke joinstyle="miter"/>
            <v:formulas>
              <v:f eqn="if lineDrawn pixelLineWidth 0"/>
              <v:f eqn="sum @0 1 0"/>
              <v:f eqn="sum 0 0 @1"/>
              <v:f eqn="prod @2 1 2"/>
              <v:f eqn="prod @3 21600 pixelWidth"/>
              <v:f eqn="prod @3 21600 pixelHeight"/>
              <v:f eqn="sum @0 0 1"/>
              <v:f eqn="prod @6 1 2"/>
              <v:f eqn="prod @7 21600 pixelWidth"/>
              <v:f eqn="sum @8 21600 0"/>
              <v:f eqn="prod @7 21600 pixelHeight"/>
              <v:f eqn="sum @10 21600 0"/>
            </v:formulas>
            <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
            <o:lock v:ext="edit" aspectratio="t"/>
          </v:shapetype>
          <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:451.5pt;height:25.5pt" o:ole="">
            <v:imagedata r:id="rId5" o:title=""/>
          </v:shape>
          <o:OLEObject Type="Embed" ProgID="Word.Document.12" ShapeID="_x0000_i1025" DrawAspect="Content" ObjectID="_1416673934" r:id="rId6">
            <o:FieldCodes>\s</o:FieldCodes>
          </o:OLEObject>
        </w:object>
 
Parsed in 0.003 seconds, using GeSHi 1.0.8.4


and parts:

Code: Select all
        Part /word/embeddings/Microsoft_Word_Document1.docx [org.docx4j.openpackaging.parts.WordprocessingML.EmbeddedPackagePart] http://schemas.openxmlformats.org/officeDocument/2006/relationships/package
        Part /word/media/image1.emf [org.docx4j.openpackaging.parts.WordprocessingML.MetafileEmfPart] http://schemas.openxmlformats.org/officeDocument/2006/relationships/image


So you should use EmbeddedPackagePart, not OleObjectBinaryPart