From: Nick Burch Date: Mon, 28 Nov 2011 18:42:30 +0000 (+0000) Subject: Restore HWPF support for inline Escher images (stored in Escher rather than direct... X-Git-Tag: REL_3_8_BETA5~14 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b8e52ae6ff2c5f29a702f16a986b923f7fd21196;p=poi.git Restore HWPF support for inline Escher images (stored in Escher rather than direct in a PICFAndOfficeArtData in the main stream), plus add test for this kind of file git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1207497 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/PicturesTable.java b/src/scratchpad/src/org/apache/poi/hwpf/model/PicturesTable.java index c0b440ff16..0b8b501bf3 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/model/PicturesTable.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/PicturesTable.java @@ -18,12 +18,9 @@ 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 ) diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java index 06e84a4f11..413c030952 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java @@ -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 _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: diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java index 526cb5a478..a3fcd3abfb 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java @@ -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 index 0000000000..4d8c41792c Binary files /dev/null and b/test-data/document/PngPicture.doc differ