]> source.dussan.org Git - poi.git/commitdiff
Restore HWPF support for inline Escher images (stored in Escher rather than direct...
authorNick Burch <nick@apache.org>
Mon, 28 Nov 2011 18:42:30 +0000 (18:42 +0000)
committerNick Burch <nick@apache.org>
Mon, 28 Nov 2011 18:42:30 +0000 (18:42 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1207497 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwpf/model/PicturesTable.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java
src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java
test-data/document/PngPicture.doc [new file with mode: 0644]

index c0b440ff162732a800b5647d30f855ae1f24c841..0b8b501bf3daf24f903a54a5786d02e847c783fa 100644 (file)
 package org.apache.poi.hwpf.model;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
-import org.apache.poi.util.POILogFactory;
-
-import org.apache.poi.util.POILogger;
-
 import org.apache.poi.ddf.DefaultEscherRecordFactory;
 import org.apache.poi.ddf.EscherBSERecord;
 import org.apache.poi.ddf.EscherBlipRecord;
@@ -35,6 +32,8 @@ import org.apache.poi.hwpf.usermodel.Picture;
 import org.apache.poi.hwpf.usermodel.Range;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
 
 /**
  * Holds information about all pictures embedded in Word Document either via "Insert -> Picture -> From File" or via
@@ -180,7 +179,7 @@ public final class PicturesTable
               EscherBlipRecord blip = bse.getBlipRecord();
               if (blip != null)
               {
-                  pictures.add(new Picture(blip.getPicturedata()));
+                  pictures.add(new Picture(blip));
               }
                 else if ( bse.getOffset() > 0 )
                 {
@@ -197,7 +196,7 @@ public final class PicturesTable
                             record.fillFields( _mainStream, bse.getOffset(),
                                     recordFactory );
                             blip = (EscherBlipRecord) record;
-                            pictures.add( new Picture( blip.getPicturedata() ) );
+                            pictures.add( new Picture( blip ) );
                         }
                     }
                     catch ( Exception exc )
index 06e84a4f112d45c8ff93e995f355ed11af350f80..413c0309521593d0f518756ba47ce63fd116c813 100644 (file)
@@ -21,16 +21,10 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.List;
 import java.util.zip.InflaterInputStream;
 
-import org.apache.poi.ddf.EscherSimpleProperty;
-
-import org.apache.poi.ddf.EscherProperty;
-
-import org.apache.poi.ddf.EscherOptRecord;
-
-import org.apache.poi.ddf.EscherContainerRecord;
-
 import org.apache.poi.ddf.EscherBSERecord;
 import org.apache.poi.ddf.EscherBlipRecord;
 import org.apache.poi.ddf.EscherRecord;
@@ -41,8 +35,6 @@ import org.apache.poi.util.POILogger;
 
 /**
  * Represents embedded picture extracted from Word Document
- * 
- * @author Dmitry Romanov
  */
 public final class Picture
 {
@@ -109,6 +101,7 @@ public final class Picture
 
     private PICF _picf;
     private PICFAndOfficeArtData _picfAndOfficeArtData;
+    private List<? extends EscherRecord> _blipRecords;
 
     private byte[] content;
     private int dataBlockStartOfsset;
@@ -116,18 +109,20 @@ public final class Picture
     private int height = -1;
     private int width = -1;
 
-    public Picture( byte[] _dataStream )
+    /**
+     * Builds a Picture object for a Picture stored as
+     *  Escher.
+     * TODO We need to pass in the PICF data too somehow!
+     */
+    public Picture( EscherBlipRecord blipRecord )
     {
-        super();
-
-        // XXX: implement
-        // this._dataStream = _dataStream;
-        // this.dataBlockStartOfsset = 0;
-        // this.dataBlockSize = _dataStream.length;
-        // this.pictureBytesStartOffset = 0;
-        // this.size = _dataStream.length;
+       this._blipRecords = Arrays.asList(new EscherBlipRecord[] {blipRecord});
     }
 
+    /**
+     * Builds a Picture object for a Picture stored in the
+     *  DataStream
+     */
     public Picture( int dataBlockStartOfsset, byte[] _dataStream,
             boolean fillBytes )
     {
@@ -137,8 +132,13 @@ public final class Picture
 
         this.dataBlockStartOfsset = dataBlockStartOfsset;
 
-        if ( fillBytes )
+        if ( _picfAndOfficeArtData != null && _picfAndOfficeArtData.getBlipRecords() != null) {
+           _blipRecords = _picfAndOfficeArtData.getBlipRecords();
+        }
+        
+        if ( fillBytes ) {
             fillImageContent();
+        }
     }
 
     private void fillImageContent()
@@ -432,13 +432,11 @@ public final class Picture
      */
     public byte[] getRawContent()
     {
-        if ( _picfAndOfficeArtData == null ||
-                _picfAndOfficeArtData.getBlipRecords()== null || 
-                _picfAndOfficeArtData.getBlipRecords().size() != 1 )
-            return new byte[0];
+        if (_blipRecords == null || _blipRecords.size() != 1) {
+           return new byte[0];
+        }
 
-        EscherRecord escherRecord = _picfAndOfficeArtData.getBlipRecords().get(
-                0 );
+        EscherRecord escherRecord = _blipRecords.get( 0 );
         if ( escherRecord instanceof EscherBlipRecord )
         {
             return ( (EscherBlipRecord) escherRecord ).getPicturedata();
@@ -518,13 +516,11 @@ public final class Picture
 
     public PictureType suggestPictureType()
     {
-        if ( _picfAndOfficeArtData == null ||
-                _picfAndOfficeArtData.getBlipRecords()== null || 
-                _picfAndOfficeArtData.getBlipRecords().size() != 1 )
+        if (_blipRecords == null || _blipRecords.size() != 1 ) {
             return PictureType.UNKNOWN;
+        }
 
-        EscherRecord escherRecord = _picfAndOfficeArtData.getBlipRecords().get(
-                0 );
+        EscherRecord escherRecord = _blipRecords.get( 0 );
         switch ( escherRecord.getRecordId() )
         {
         case (short) 0xF007:
index 526cb5a47892f44047d75ed8a8abfbb81ca1bf8d..a3fcd3abfb2970b512e720c44d7585219f298b9b 100644 (file)
@@ -324,4 +324,14 @@ public final class TestPictures extends TestCase {
         assertEquals(0, pic2.getDyaCropBottom());
     }
 
+    public void testPictureDetectionWithPNG() throws Exception {
+        HWPFDocument document = HWPFTestDataSamples.openSampleFile("PngPicture.doc");
+        PicturesTable pictureTable = document.getPicturesTable();
+        
+        assertEquals(1, pictureTable.getAllPictures().size());
+        
+        Picture p = pictureTable.getAllPictures().get(0);
+        assertEquals(PictureType.PNG, p.suggestPictureType());
+        assertEquals("png", p.suggestFileExtension());
+    }
 }
diff --git a/test-data/document/PngPicture.doc b/test-data/document/PngPicture.doc
new file mode 100644 (file)
index 0000000..4d8c417
Binary files /dev/null and b/test-data/document/PngPicture.doc differ