diff --git a/src/ooxml/java/org/apache/poi/POIXMLDocument.java b/src/ooxml/java/org/apache/poi/POIXMLDocument.java index 7be637275..f9f543d7b 100644 --- a/src/ooxml/java/org/apache/poi/POIXMLDocument.java +++ b/src/ooxml/java/org/apache/poi/POIXMLDocument.java @@ -41,8 +41,12 @@ public abstract class POIXMLDocument { public static final String EXTENDED_PROPERTIES_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"; + // OLE embeddings relation name public static final String OLE_OBJECT_REL_TYPE="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"; + // Embedded OPC documents relation name + public static final String PACK_OBJECT_REL_TYPE="http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"; + /** The OPC Package */ private Package pkg; @@ -57,7 +61,7 @@ public abstract class POIXMLDocument { /** * The embedded OLE2 files in the OPC package */ - private List embedds; + protected List embedds = new LinkedList(); protected POIXMLDocument() {} @@ -70,16 +74,12 @@ public abstract class POIXMLDocument { // Get core part this.corePart = this.pkg.getPart(coreDocRelationship); - - // Get any embedded OLE2 documents - this.embedds = new LinkedList(); - for(PackageRelationship rel : corePart.getRelationshipsByType(OLE_OBJECT_REL_TYPE)) { - embedds.add(getTargetPart(rel)); - } + } catch (OpenXML4JException e) { throw new IOException(e.toString()); } } + protected POIXMLDocument(String path) throws IOException { this(openPackage(path)); } diff --git a/src/ooxml/java/org/apache/poi/xslf/XSLFSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/XSLFSlideShow.java index fbdf00b01..ce66aefe9 100644 --- a/src/ooxml/java/org/apache/poi/xslf/XSLFSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/XSLFSlideShow.java @@ -24,6 +24,7 @@ import org.openxml4j.exceptions.InvalidFormatException; import org.openxml4j.exceptions.OpenXML4JException; import org.openxml4j.opc.Package; import org.openxml4j.opc.PackagePart; +import org.openxml4j.opc.PackageRelationship; import org.openxml4j.opc.PackageRelationshipCollection; import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide; import org.openxmlformats.schemas.presentationml.x2006.main.CTPresentation; @@ -63,6 +64,17 @@ public class XSLFSlideShow extends POIXMLDocument { presentationDoc = PresentationDocument.Factory.parse(getCorePart().getInputStream()); + + for (CTSlideIdListEntry ctSlide : getSlideReferences().getSldIdArray()) { + PackagePart slidePart = + getTargetPart(getCorePart().getRelationship(ctSlide.getId2())); + + for(PackageRelationship rel : slidePart.getRelationshipsByType(OLE_OBJECT_REL_TYPE)) + embedds.add(getTargetPart(rel)); // TODO: Add this reference to each slide as well + + for(PackageRelationship rel : slidePart.getRelationshipsByType(PACK_OBJECT_REL_TYPE)) + embedds.add(getTargetPart(rel)); + } } public XSLFSlideShow(String file) throws OpenXML4JException, IOException, XmlException { this(openPackage(file)); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index 9fe9ff80a..719fc63a1 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -121,7 +121,21 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { null, null ); - + public static final XSSFRelation OLEEMBEDDINGS = new XSSFRelation( + null, + OLE_OBJECT_REL_TYPE, + null, + null + ); + + public static final XSSFRelation PACKEMBEDDINGS = new XSSFRelation( + null, + PACK_OBJECT_REL_TYPE, + null, + null + ); + + public static class XSSFRelation { private String TYPE; private String REL; @@ -292,6 +306,13 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { PackageRelationshipCollection hyperlinkRels = part.getRelationshipsByType(SHEET_HYPERLINKS.REL); sheet.initHyperlinks(hyperlinkRels); + + // Get the embeddings for the workbook + for(PackageRelationship rel : part.getRelationshipsByType(OLEEMBEDDINGS.REL)) + embedds.add(getTargetPart(rel)); // TODO: Add this reference to each sheet as well + + for(PackageRelationship rel : part.getRelationshipsByType(PACKEMBEDDINGS.REL)) + embedds.add(getTargetPart(rel)); } } catch (XmlException e) { throw new IOException(e.toString()); diff --git a/src/ooxml/java/org/apache/poi/xwpf/XWPFDocument.java b/src/ooxml/java/org/apache/poi/xwpf/XWPFDocument.java index 4338b11f2..d7fa573bb 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/XWPFDocument.java +++ b/src/ooxml/java/org/apache/poi/xwpf/XWPFDocument.java @@ -114,6 +114,15 @@ public class XWPFDocument extends POIXMLDocument { tables.add(new XWPFTable(table)); } } + + this.embedds = new LinkedList(); + for(PackageRelationship rel : getCorePart().getRelationshipsByType(OLE_OBJECT_REL_TYPE)) { + embedds.add(getTargetPart(rel)); + } + + for(PackageRelationship rel : getCorePart().getRelationshipsByType(PACK_OBJECT_REL_TYPE)) { + embedds.add(getTargetPart(rel)); + } } /** diff --git a/src/ooxml/testcases/org/apache/poi/TestEmbeded.java b/src/ooxml/testcases/org/apache/poi/TestEmbeded.java index 5e127e21c..95bbe51f2 100644 --- a/src/ooxml/testcases/org/apache/poi/TestEmbeded.java +++ b/src/ooxml/testcases/org/apache/poi/TestEmbeded.java @@ -49,7 +49,7 @@ public class TestEmbeded extends TestCase assertTrue(f.exists()); POIXMLDocument doc = new XSSFWorkbook(Package.open(f.toString())); - test(doc, 0); + test(doc, 4); } public void testWord() throws Exception { @@ -57,7 +57,7 @@ public class TestEmbeded extends TestCase assertTrue(f.exists()); POIXMLDocument doc = new XWPFDocument(Package.open(f.toString())); - test(doc, 4); + test(doc, 5); } public void testPowerPoint() throws Exception { @@ -65,7 +65,7 @@ public class TestEmbeded extends TestCase assertTrue(f.exists()); POIXMLDocument doc = new XSLFSlideShow(Package.open(f.toString())); - test(doc, 0); + test(doc, 4); } private void test(POIXMLDocument doc, int expectedCount) throws Exception { diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/data/ExcelWithAttachments.xlsx b/src/ooxml/testcases/org/apache/poi/ooxml/data/ExcelWithAttachments.xlsx index 5ec8b94ad..cb3e56442 100644 Binary files a/src/ooxml/testcases/org/apache/poi/ooxml/data/ExcelWithAttachments.xlsx and b/src/ooxml/testcases/org/apache/poi/ooxml/data/ExcelWithAttachments.xlsx differ diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/data/PPTWithAttachments.pptx b/src/ooxml/testcases/org/apache/poi/ooxml/data/PPTWithAttachments.pptx index 01ec2d572..00b148da1 100644 Binary files a/src/ooxml/testcases/org/apache/poi/ooxml/data/PPTWithAttachments.pptx and b/src/ooxml/testcases/org/apache/poi/ooxml/data/PPTWithAttachments.pptx differ diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/data/WordWithAttachments.docx b/src/ooxml/testcases/org/apache/poi/ooxml/data/WordWithAttachments.docx index 8de2f3168..ebefabc44 100644 Binary files a/src/ooxml/testcases/org/apache/poi/ooxml/data/WordWithAttachments.docx and b/src/ooxml/testcases/org/apache/poi/ooxml/data/WordWithAttachments.docx differ