From a7796d06d848a3b1aaac941adc7baf2f1b6c9ff0 Mon Sep 17 00:00:00 2001 From: Nick Burch <nick@apache.org> Date: Tue, 1 May 2012 09:46:15 +0000 Subject: [PATCH] Patch from Josh Holthaus from bug #53165 - HWPF support for fetching the description (alt text) of a picture git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1332594 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../apache/poi/hwpf/usermodel/Picture.java | 27 ++++++++++++++++++ .../poi/hwpf/usermodel/TestPictures.java | 8 ++++++ .../document/Picture_Alternative_Text.doc | Bin 0 -> 26112 bytes 4 files changed, 36 insertions(+) create mode 100644 test-data/document/Picture_Alternative_Text.doc diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 17c2490dfe..7b085461f6 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ <changes> <release version="3.9-beta1" date="2012-??-??"> + <action dev="poi-developers" type="add">53165 - HWPF support for fetching the description (alt text) of a picture</action> <action dev="poi-developers" type="fix">48528 - support negative arguments to the DATE() function</action> <action dev="poi-developers" type="fix">53092 - allow specifying of a TimeZone to DateUtil.getJavaDate(), for when it is known that a file comes from a different (known) timezone to the current machine</action> <action dev="poi-developers" type="fix">53043 - don't duplicate hyperlink relationships when saving XSSF file</action> 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 58ad7aefa1..ff7af7cf21 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java @@ -27,11 +27,16 @@ import java.util.zip.InflaterInputStream; import org.apache.poi.ddf.EscherBSERecord; import org.apache.poi.ddf.EscherBlipRecord; +import org.apache.poi.ddf.EscherComplexProperty; +import org.apache.poi.ddf.EscherOptRecord; +import org.apache.poi.ddf.EscherProperties; +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.POILogFactory; import org.apache.poi.util.POILogger; +import org.apache.poi.util.StringUtil; /** * Represents embedded picture extracted from Word Document @@ -488,6 +493,28 @@ public final class Picture } return width; } + + /** + * returns the description stored in the alternative text + * + * @return pictue description + */ + public String getDescription() + { + for(EscherRecord escherRecord : _picfAndOfficeArtData.getShape().getChildRecords()){ + if(escherRecord instanceof EscherOptRecord){ + EscherOptRecord escherOptRecord = (EscherOptRecord) escherRecord; + for(EscherProperty property : escherOptRecord.getEscherProperties()){ + if(EscherProperties.GROUPSHAPE__DESCRIPTION == property.getPropertyNumber()){ + byte[] complexData = ((EscherComplexProperty)property).getComplexData(); + return StringUtil.getFromUnicodeLE(complexData,0,complexData.length/2-1); + } + } + } + } + + return null; + } /** * tries to suggest extension for picture's file by matching signatures of 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 c2d4093fdf..cddaee7e43 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java @@ -333,4 +333,12 @@ public final class TestPictures extends TestCase { assertEquals(PictureType.PNG, p.suggestPictureType()); assertEquals("png", p.suggestFileExtension()); } + + public void testPictureWithAlternativeText() throws Exception { + HWPFDocument document = HWPFTestDataSamples.openSampleFile("Picture_Alternative_Text.doc"); + PicturesTable pictureTable = document.getPicturesTable(); + Picture picture = pictureTable.getAllPictures().get(0); + + assertEquals("This is the alternative text for the picture.", picture.getDescription()); + } } diff --git a/test-data/document/Picture_Alternative_Text.doc b/test-data/document/Picture_Alternative_Text.doc new file mode 100644 index 0000000000000000000000000000000000000000..55bf875d0d27bca9488930e5250c4dd535875dde GIT binary patch literal 26112 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 O;78wWGxVRPf&T|g5Hv~v literal 0 HcmV?d00001