You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2014/08/05 00:00:48 UTC

svn commit: r1615812 - in /poi/trunk/src/ooxml: java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java testcases/org/apache/poi/xslf/TestXSLFBugs.java

Author: nick
Date: Mon Aug  4 22:00:47 2014
New Revision: 1615812

URL: http://svn.apache.org/r1615812
Log:
Fix bug #56812 - In XSLF provide a way to get the URI of externally linked pictures

Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java?rev=1615812&r1=1615811&r2=1615812&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java Mon Aug  4 22:00:47 2014
@@ -23,6 +23,7 @@ import java.awt.Graphics2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
+import java.net.URI;
 
 import javax.imageio.ImageIO;
 import javax.xml.namespace.QName;
@@ -99,10 +100,27 @@ public class XSLFPictureShape extends XS
             setAnchor(new java.awt.Rectangle(50, 50, 200, 200));
         }
     }
+    
+    /**
+     * Is this an internal picture (image data included within
+     *  the PowerPoint file), or an external linked picture
+     *  (image lives outside)?
+     */
+    public boolean isExternalLinkedPicture() {
+        if (getBlipId() == null && getBlipLink() != null) {
+            return true;
+        }
+        return false;
+    }
 
+    /**
+     * Return the data on the (internal) picture.
+     * For an external linked picture, will return null
+     */
     public XSLFPictureData getPictureData() {
         if(_data == null){
             String blipId = getBlipId();
+            if (blipId == null) return null;
 
             PackagePart p = getSheet().getPackagePart();
             PackageRelationship rel = p.getRelationship(blipId);
@@ -118,10 +136,45 @@ public class XSLFPictureShape extends XS
         }
         return _data;
     }
+    
+    /**
+     * For an external linked picture, return the last-seen
+     *  path to the picture.
+     * For an internal picture, returns null.
+     */
+    public URI getPictureLink() {
+        if (getBlipId() != null) {
+            // Internal picture, nothing to return
+            return null;
+        }
+        
+        String rId = getBlipLink();
+        if (rId == null) {
+            // No link recorded, nothing we can do
+            return null;
+        }
+        
+        PackagePart p = getSheet().getPackagePart();
+        PackageRelationship rel = p.getRelationship(rId);
+        if (rel != null) {
+            return rel.getTargetURI();
+        }
+        return null;
+    }
 
-    private String getBlipId(){
+    private CTBlip getBlip(){
         CTPicture ct = (CTPicture)getXmlObject();
-        return ct.getBlipFill().getBlip().getEmbed();
+        return ct.getBlipFill().getBlip();
+    }
+    private String getBlipLink(){
+        String link = getBlip().getLink();
+        if (link.isEmpty()) return null;
+        return link;
+    }
+    private String getBlipId(){
+        String id = getBlip().getEmbed();
+        if (id.isEmpty()) return null;
+        return id;
     }
 
     @Override

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java?rev=1615812&r1=1615811&r2=1615812&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java Mon Aug  4 22:00:47 2014
@@ -144,24 +144,34 @@ public class TestXSLFBugs extends POITes
      * there is no data available and XSLFPictureShape.getPictureData()
      * gives a NPE, see bug #56812
      */
-    public void DISABLEDtest56812() throws Exception {
+    public void test56812() throws Exception {
         XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("56812.pptx");
         
-        int pictures = 0;
+        int internalPictures = 0;
+        int externalPictures = 0;
         for (XSLFSlide slide : ppt.getSlides()){
             for (XSLFShape shape : slide.getShapes()){
                 assertNotNull(shape);
                 
                 if (shape instanceof XSLFPictureShape) {
-                    XSLFPictureData data = ((XSLFPictureShape) shape).getPictureData();
-                    assertNotNull(data);
-                    assertNotNull(data.getFileName());
-                    pictures++;
+                    XSLFPictureShape picture = (XSLFPictureShape)shape;
+                    if (picture.isExternalLinkedPicture()) {
+                        externalPictures++;
+                        
+                        assertNotNull(picture.getPictureLink());
+                    } else {
+                        internalPictures++;
+                        
+                        XSLFPictureData data = picture.getPictureData();
+                        assertNotNull(data);
+                        assertNotNull(data.getFileName());
+                    }
                 }
             }
         }
         
-        assertEquals(3, pictures);
+        assertEquals(2, internalPictures);
+        assertEquals(1, externalPictures);
     }
     
     protected String getSlideText(XSLFSlide slide) {



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org