From cc28ea53f78bad0289ef569d98a72e6033ae1933 Mon Sep 17 00:00:00 2001 From: Sergey Vladimirov Date: Thu, 28 Jul 2011 08:49:38 +0000 Subject: [PATCH] fix picture matching procedure git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1151766 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hwpf/usermodel/Picture.java | 42 ++++++++++--------- .../poi/hwpf/usermodel/TestPictures.java | 19 ++++++++- 2 files changed, 41 insertions(+), 20 deletions(-) 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 926946d921..b42ad00637 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java @@ -168,26 +168,26 @@ public final class Picture extends PictureDescriptor return dataBlockStartOfsset; } - /** - * @return picture's content as byte array - */ - public byte[] getContent() - { - if (content == null || content.length<=0) + /** + * @return picture's content as byte array + */ + public byte[] getContent() { - fillImageContent(); + fillImageContent(); + return content; } - return content; - } - public byte[] getRawContent() - { - if (rawContent == null || rawContent.length <= 0) + /** + * Returns picture's content as it stored in Word file, i.e. possibly in + * compressed form. + * + * @return picture's content as it stored in Word file + */ + public byte[] getRawContent() { - fillRawImageContent(); + fillRawImageContent(); + return rawContent; } - return rawContent; - } /** * @@ -304,12 +304,10 @@ public final class Picture extends PictureDescriptor public PictureType suggestPictureType() { - fillImageContent(); - + final byte[] imageContent = getContent(); for ( PictureType pictureType : PictureType.values() ) for ( byte[] signature : pictureType.getSignatures() ) - if ( matchSignature( _dataStream, signature, - pictureBytesStartOffset ) ) + if ( matchSignature( imageContent, signature, 0 ) ) return pictureType; // TODO: DIB, PICT @@ -355,12 +353,18 @@ public final class Picture extends PictureDescriptor private void fillRawImageContent() { + if ( rawContent != null && rawContent.length > 0 ) + return; + this.rawContent = new byte[size]; System.arraycopy(_dataStream, pictureBytesStartOffset, rawContent, 0, size); } private void fillImageContent() { + if ( content != null && content.length > 0 ) + return; + byte[] rawContent = getRawContent(); // HACK: Detect compressed images. In reality there should be some way to determine 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 81bf2be56a..938b77a018 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java @@ -261,7 +261,24 @@ public final class TestPictures extends TestCase { assertEquals("10a8", picture.suggestFullFileName()); assertEquals("image/unknown", picture.getMimeType()); } - + + public void testEquation() + { + HWPFDocument doc = HWPFTestDataSamples.openSampleFile( "equation.doc" ); + PicturesTable pictures = doc.getPicturesTable(); + + final List allPictures = pictures.getAllPictures(); + assertEquals( 1, allPictures.size() ); + + Picture picture = allPictures.get( 0 ); + assertNotNull( picture ); + assertEquals( PictureType.EMF, picture.suggestPictureType() ); + assertEquals( PictureType.EMF.getExtension(), + picture.suggestFileExtension() ); + assertEquals( PictureType.EMF.getMime(), picture.getMimeType() ); + assertEquals( "0.emf", picture.suggestFullFileName() ); + } + /** * In word you can have floating or fixed pictures. * Fixed have a \u0001 in place with an offset to the -- 2.39.5