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