You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2019/09/11 21:24:34 UTC

svn commit: r1866809 - in /poi/trunk/src: java/org/apache/poi/hssf/usermodel/ java/org/apache/poi/sl/image/ java/org/apache/poi/util/ scratchpad/src/org/apache/poi/hslf/blip/ scratchpad/src/org/apache/poi/hwpf/usermodel/

Author: kiwiwings
Date: Wed Sep 11 21:24:34 2019
New Revision: 1866809

URL: http://svn.apache.org/viewvc?rev=1866809&view=rev
Log:
Unify PNG extraction

Added:
    poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java
      - copied, changed from r1866808, poi/trunk/src/java/org/apache/poi/util/PngUtils.java
Removed:
    poi/trunk/src/java/org/apache/poi/util/PngUtils.java
Modified:
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java?rev=1866809&r1=1866808&r2=1866809&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPictureData.java Wed Sep 11 21:24:34 2019
@@ -18,12 +18,11 @@
 
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.ddf.EscherBitmapBlip;
 import org.apache.poi.ddf.EscherBlipRecord;
-import org.apache.poi.ddf.EscherMetafileBlip;
+import org.apache.poi.ddf.EscherRecordTypes;
+import org.apache.poi.sl.image.ImageHeaderPNG;
 import org.apache.poi.ss.usermodel.PictureData;
 import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.util.PngUtils;
 
 /**
  * Represents binary data stored in the file.  Eg. A GIF, JPEG etc...
@@ -58,20 +57,8 @@ public class HSSFPictureData implements
     /* (non-Javadoc)
      * @see org.apache.poi.hssf.usermodel.PictureData#getData()
      */
-    public byte[] getData()
-    {
-        byte[] pictureData = blip.getPicturedata();
-
-        //PNG created on MAC may have a 16-byte prefix which prevents successful reading.
-        //Just cut it off!.
-        if (PngUtils.matchesPngHeader(pictureData, 16))
-        {
-            byte[] png = new byte[pictureData.length-16];
-            System.arraycopy(pictureData, 16, png, 0, png.length);
-            pictureData = png;
-        }
-
-        return pictureData;
+    public byte[] getData() {
+        return new ImageHeaderPNG(blip.getPicturedata()).extractPNG();
     }
 
     /**
@@ -93,18 +80,18 @@ public class HSSFPictureData implements
     * @return 'wmf', 'jpeg' etc depending on the format. never <code>null</code>
     */
     public String suggestFileExtension() {
-        switch (blip.getRecordId()) {
-            case EscherMetafileBlip.RECORD_ID_WMF:
+        switch (EscherRecordTypes.forTypeID(blip.getRecordId())) {
+            case BLIP_WMF:
                 return "wmf";
-            case EscherMetafileBlip.RECORD_ID_EMF:
+            case BLIP_EMF:
                 return "emf";
-            case EscherMetafileBlip.RECORD_ID_PICT:
+            case BLIP_PICT:
                 return "pict";
-            case EscherBitmapBlip.RECORD_ID_PNG:
+            case BLIP_PNG:
                 return "png";
-            case EscherBitmapBlip.RECORD_ID_JPEG:
+            case BLIP_JPEG:
                 return "jpeg";
-            case EscherBitmapBlip.RECORD_ID_DIB:
+            case BLIP_DIB:
                 return "dib";
             default:
                 return "";
@@ -115,18 +102,18 @@ public class HSSFPictureData implements
      * Returns the mime type for the image
      */
     public String getMimeType() {
-       switch (blip.getRecordId()) {
-           case EscherMetafileBlip.RECORD_ID_WMF:
+       switch (EscherRecordTypes.forTypeID(blip.getRecordId())) {
+           case BLIP_WMF:
                return "image/x-wmf";
-           case EscherMetafileBlip.RECORD_ID_EMF:
+           case BLIP_EMF:
                return "image/x-emf";
-           case EscherMetafileBlip.RECORD_ID_PICT:
+           case BLIP_PICT:
                return "image/x-pict";
-           case EscherBitmapBlip.RECORD_ID_PNG:
+           case BLIP_PNG:
                return "image/png";
-           case EscherBitmapBlip.RECORD_ID_JPEG:
+           case BLIP_JPEG:
                return "image/jpeg";
-           case EscherBitmapBlip.RECORD_ID_DIB:
+           case BLIP_DIB:
                return "image/bmp";
            default:
                return "image/unknown";
@@ -144,18 +131,18 @@ public class HSSFPictureData implements
      * @see Workbook#PICTURE_TYPE_WMF
      */
     public int getPictureType() {
-        switch (blip.getRecordId()) {
-            case EscherMetafileBlip.RECORD_ID_WMF:
+        switch (EscherRecordTypes.forTypeID(blip.getRecordId())) {
+            case BLIP_WMF:
                 return Workbook.PICTURE_TYPE_WMF;
-            case EscherMetafileBlip.RECORD_ID_EMF:
+            case BLIP_EMF:
                 return Workbook.PICTURE_TYPE_EMF;
-            case EscherMetafileBlip.RECORD_ID_PICT:
+            case BLIP_PICT:
                 return Workbook.PICTURE_TYPE_PICT;
-            case EscherBitmapBlip.RECORD_ID_PNG:
+            case BLIP_PNG:
                 return Workbook.PICTURE_TYPE_PNG;
-            case EscherBitmapBlip.RECORD_ID_JPEG:
+            case BLIP_JPEG:
                 return Workbook.PICTURE_TYPE_JPEG;
-            case EscherBitmapBlip.RECORD_ID_DIB:
+            case BLIP_DIB:
                 return Workbook.PICTURE_TYPE_DIB;
             default:
                 return -1;

Copied: poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java (from r1866808, poi/trunk/src/java/org/apache/poi/util/PngUtils.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java?p2=poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java&p1=poi/trunk/src/java/org/apache/poi/util/PngUtils.java&r1=1866808&r2=1866809&rev=1866809&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/PngUtils.java (original)
+++ poi/trunk/src/java/org/apache/poi/sl/image/ImageHeaderPNG.java Wed Sep 11 21:24:34 2019
@@ -15,39 +15,45 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.util;
+package org.apache.poi.sl.image;
 
 
-public final class PngUtils {
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.poi.poifs.filesystem.FileMagic;
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.util.RecordFormatException;
+
+public final class ImageHeaderPNG {
+
+    private static final int MAGIC_OFFSET = 16;
+
+    private byte[] data;
 
     /**
-     * File header for PNG format.
+     * @param data The raw image data
      */
-    private static final byte[] PNG_FILE_HEADER =
-        new byte[] { (byte) 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
-
-    private PngUtils() {
-        // no instances of this class
+    public ImageHeaderPNG(byte[] data) {
+        this.data = data;
     }
 
     /**
-     * Checks if the offset matches the PNG header.
-     *
-     * @param data the data to check.
-     * @param offset the offset to check at.
-     * @return {@code true} if the offset matches.
+     * PNG created on MAC may have a 16-byte prefix which prevents successful reading.
+     * @return the trimmed PNG data
      */
-    public static boolean matchesPngHeader(byte[] data, int offset) {
-        if (data == null || data.length - offset < PNG_FILE_HEADER.length) {
-            return false;
-        }
-
-        for (int i = 0; i < PNG_FILE_HEADER.length; i++) {
-            if (PNG_FILE_HEADER[i] != data[i + offset]) {
-                return false;
+    public byte[] extractPNG() {
+        //
+        //Just cut it off!.
+        try (InputStream is = new ByteArrayInputStream(data)) {
+            if (is.skip(MAGIC_OFFSET) == MAGIC_OFFSET && FileMagic.valueOf(is) == FileMagic.PNG) {
+                return IOUtils.toByteArray(is);
             }
+        } catch (IOException e) {
+            throw new RecordFormatException("Unable to parse PNG header", e);
         }
 
-        return true;
+        return data;
     }
 }

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java?rev=1866809&r1=1866808&r2=1866809&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java Wed Sep 11 21:24:34 2019
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hslf.blip;
 
-import org.apache.poi.util.PngUtils;
+import org.apache.poi.sl.image.ImageHeaderPNG;
 
 /**
  * Represents a PNG picture data in a PPT file
@@ -26,17 +26,7 @@ public final class PNG extends Bitmap {
 
     @Override
     public byte[] getData() {
-        byte[] data = super.getData();
-
-        //PNG created on MAC may have a 16-byte prefix which prevents successful reading.
-        //Just cut it off!.
-        if (PngUtils.matchesPngHeader(data, 16)) {
-            byte[] png = new byte[data.length-16];
-            System.arraycopy(data, 16, png, 0, png.length);
-            data = png;
-        }
-
-        return data;
+        return new ImageHeaderPNG(super.getData()).extractPNG();
     }
 
     @Override

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java?rev=1866809&r1=1866808&r2=1866809&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java Wed Sep 11 21:24:34 2019
@@ -34,7 +34,7 @@ import org.apache.poi.ddf.EscherProperty
 import org.apache.poi.ddf.EscherRecord;
 import org.apache.poi.hwpf.model.PICF;
 import org.apache.poi.hwpf.model.PICFAndOfficeArtData;
-import org.apache.poi.util.PngUtils;
+import org.apache.poi.sl.image.ImageHeaderPNG;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 import org.apache.poi.util.StringUtil;
@@ -169,16 +169,7 @@ public final class Picture {
         else
         {
             // Raw data is not compressed.
-            content = rawContent;
-
-            //PNG created on MAC may have a 16-byte prefix which prevents successful reading.
-            //Just cut it off!.
-            if (PngUtils.matchesPngHeader(content, 16))
-            {
-                byte[] png = new byte[content.length-16];
-                System.arraycopy(content, 16, png, 0, png.length);
-                content = png;
-            }
+            content = new ImageHeaderPNG(rawContent).extractPNG();
         }
     }
 



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