]> source.dussan.org Git - poi.git/commitdiff
Return a list of all pictures for a workbook. This shows a discrepancy between the...
authorUgo Cei <ugo@apache.org>
Tue, 19 Feb 2008 17:34:39 +0000 (17:34 +0000)
committerUgo Cei <ugo@apache.org>
Tue, 19 Feb 2008 17:34:39 +0000 (17:34 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@629170 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java
src/ooxml/interfaces-jdk14/org/apache/poi/ss/usermodel/PictureData.java [new file with mode: 0644]
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/PictureData.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/POIXMLDocument.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/data/picture.xlsx [new file with mode: 0644]
src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java

index 439100a53ac53e93257415d2a818fcce037597dd..8607e5cf7b0cc558cac2c25602733cc3d897ddcc 100644 (file)
 
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.ddf.EscherBitmapBlip;
 import org.apache.poi.ddf.EscherBlipRecord;
+import org.apache.poi.ss.usermodel.PictureData;
 
 /**
  * Represents binary data stored in the file.  Eg. A GIF, JPEG etc...
  *
  * @author Daniel Noll
  */
-public class HSSFPictureData
+public class HSSFPictureData implements PictureData
 {
     // MSOBI constants for various formats.
     public static final short MSOBI_WMF   = 0x2160;
@@ -52,20 +52,16 @@ public class HSSFPictureData
         this.blip = blip;
     }
 
-    /**
-     * Gets the picture data.
-     *
-     * @return the picture data.
+    /* (non-Javadoc)
+     * @see org.apache.poi.hssf.usermodel.PictureData#getData()
      */
     public byte[] getData()
     {
         return blip.getPicturedata();
     }
 
-    /**
-     * Suggests a file extension for this image.
-     *
-     * @return the file extension.
+    /* (non-Javadoc)
+     * @see org.apache.poi.hssf.usermodel.PictureData#suggestFileExtension()
      */
     public String suggestFileExtension()
     {
diff --git a/src/ooxml/interfaces-jdk14/org/apache/poi/ss/usermodel/PictureData.java b/src/ooxml/interfaces-jdk14/org/apache/poi/ss/usermodel/PictureData.java
new file mode 100644 (file)
index 0000000..a38a70a
--- /dev/null
@@ -0,0 +1,20 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.usermodel;
+
+public interface PictureData {}
\ No newline at end of file
diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/PictureData.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/PictureData.java
new file mode 100644 (file)
index 0000000..a799de8
--- /dev/null
@@ -0,0 +1,36 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.usermodel;
+
+public interface PictureData {
+
+    /**
+     * Gets the picture data.
+     *
+     * @return the picture data.
+     */
+    byte[] getData();
+
+    /**
+     * Suggests a file extension for this image.
+     *
+     * @return the file extension.
+     */
+    String suggestFileExtension();
+
+}
\ No newline at end of file
index f84418545ac68ec14cf55ce52aaa294105900beb..6f8a7e37d800e6fafd08395cd01a0fe5dc30e247 100644 (file)
@@ -65,7 +65,14 @@ public abstract class POIXMLDocument {
         return this.corePart;
     }
 
-    protected PackagePart getPart(PackageRelationship rel) throws InvalidFormatException {
+    /**
+     * Get the PackagePart that is the target of a relationship.
+     * 
+     * @param rel The relationship
+     * @return The target part
+     * @throws InvalidFormatException
+     */
+    protected PackagePart getTargetPart(PackageRelationship rel) throws InvalidFormatException {
         PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
         PackagePart part = getPackage().getPart(relName);
         if (part == null) {
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java
new file mode 100644 (file)
index 0000000..91ed5f8
--- /dev/null
@@ -0,0 +1,42 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.xssf.usermodel;
+
+import org.apache.poi.ss.usermodel.PictureData;
+import org.openxml4j.opc.PackagePart;
+
+
+public class XSSFPictureData implements PictureData {
+
+    private PackagePart packagePart;
+    
+    public XSSFPictureData(PackagePart packagePart) {
+        this.packagePart = packagePart;
+    }
+
+    public byte[] getData() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public String suggestFileExtension() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}
index c1e0c05af705eccbb00b21c8b7648c6a13f0c669..dfded4ae73a2977915adc6637cf3c4fbb05179c5 100644 (file)
@@ -17,6 +17,7 @@
 
 package org.apache.poi.xssf.usermodel;
 
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -28,6 +29,7 @@ import org.apache.poi.ss.usermodel.Comment;
 import org.apache.poi.ss.usermodel.Footer;
 import org.apache.poi.ss.usermodel.Header;
 import org.apache.poi.ss.usermodel.Patriarch;
+import org.apache.poi.ss.usermodel.PictureData;
 import org.apache.poi.ss.usermodel.PrintSetup;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
index 4d261a4b315cf1f2d8684f12a075aa13515ec1c5..bc4d943cd6a7915dd9283c61e14329b84e865de4 100644 (file)
@@ -31,6 +31,7 @@ import org.apache.poi.ss.usermodel.DataFormat;
 import org.apache.poi.ss.usermodel.Font;
 import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Palette;
+import org.apache.poi.ss.usermodel.PictureData;
 import org.apache.poi.ss.usermodel.SharedStringSource;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -66,6 +67,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
 
     private static final String SHARED_STRINGS_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
     
+    private static final String DRAWING_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
+    
+    private static final String IMAGE_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
+    
     private CTWorkbook workbook;
     
     private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
@@ -92,17 +97,15 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
             Iterator<PackageRelationship> it = prc.iterator();
             if (it.hasNext()) { 
                 PackageRelationship rel = it.next();
-                PackagePart part = getPart(rel);
+                PackagePart part = getTargetPart(rel);
                 this.sharedStringSource = new SharedStringsTable(part);
             }
             // Load individual sheets
             for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
-                PackageRelationship rel = this.getCorePart().getRelationship(ctSheet.getId());
-                if (rel == null) {
-                    log.log(log.WARN, "No relationship found for sheet " + ctSheet.getId());
+                PackagePart part = getPackagePart(ctSheet);
+                if (part == null) {
                     continue;
                 }
-                PackagePart part = getPart(rel);
                 WorksheetDocument worksheetDoc = WorksheetDocument.Factory.parse(part.getInputStream());
                 XSSFSheet sheet = new XSSFSheet(ctSheet, worksheetDoc.getWorksheet(), this);
                 this.sheets.add(sheet);
@@ -117,6 +120,22 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
     protected CTWorkbook getWorkbook() {
         return this.workbook;
     }
+
+    /**
+     * Get the PackagePart corresponding to a given sheet.
+     * 
+     * @param ctSheet The sheet
+     * @return A PackagePart, or null if no matching part found.
+     * @throws InvalidFormatException
+     */
+    private PackagePart getPackagePart(CTSheet ctSheet) throws InvalidFormatException {
+        PackageRelationship rel = this.getCorePart().getRelationship(ctSheet.getId());
+        if (rel == null) {
+            log.log(POILogger.WARN, "No relationship found for sheet " + ctSheet.getId());
+            return null;
+        }
+        return getTargetPart(rel);
+    }
     
     public int addPicture(byte[] pictureData, int format) {
         // TODO Auto-generated method stub
@@ -209,9 +228,30 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
         return null;
     }
 
-    public List getAllPictures() {
-        // TODO Auto-generated method stub
-        return null;
+    public List<PictureData> getAllPictures() {
+        // In OOXML pictures are referred to in sheets
+        List<PictureData> pictures = new LinkedList<PictureData>();
+        for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
+            try {
+                PackagePart sheetPart = getPackagePart(ctSheet);
+                if (sheetPart == null) {
+                    continue;
+                }
+                PackageRelationshipCollection prc = sheetPart.getRelationshipsByType(DRAWING_RELATIONSHIP);
+                for (PackageRelationship rel : prc) {
+                    PackagePart drawingPart = getTargetPart(rel);
+                    PackageRelationshipCollection prc2 = drawingPart.getRelationshipsByType(IMAGE_RELATIONSHIP);
+                    for (PackageRelationship rel2 : prc2) {
+                        PackagePart imagePart = getTargetPart(rel2);
+                        XSSFPictureData pd = new XSSFPictureData(imagePart);
+                        pictures.add(pd);
+                    }
+                }
+            } catch (InvalidFormatException e) {
+                throw new RuntimeException(e.getMessage(), e);
+            }
+        }
+        return pictures;
     }
 
     public boolean getBackupFlag() {
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/data/picture.xlsx b/src/ooxml/testcases/org/apache/poi/xssf/data/picture.xlsx
new file mode 100644 (file)
index 0000000..9cdec42
Binary files /dev/null and b/src/ooxml/testcases/org/apache/poi/xssf/data/picture.xlsx differ
index ec2b113b86dd8ab038dae0ecccb1009c58ae6764..ff7f0ff47c08b48aca9438ddf71ea4b208982d5a 100644 (file)
 package org.apache.poi.xssf.io;
 
 import java.io.File;
+import java.util.List;
 
 import junit.framework.TestCase;
 
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.PictureData;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -62,5 +64,11 @@ public class TestLoadSaveXSSF extends TestCase {
         CellStyle style = cell.getCellStyle();
         // assertNotNull(style);
     }
+    
+    public void testLoadPictures() throws Exception {
+        XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "picture.xlsx").getAbsolutePath());
+        List<PictureData> pictures = workbook.getAllPictures();
+        assertEquals(1, pictures.size());
+    }
 
 }