diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index b1d8184e7..d5f6e9c53 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -36,6 +36,7 @@ + 44296 - Fix for reading slide background images 44293 - Avoid swapping AreaPtgs from relative to absolute 44292 - Correctly process the last paragraph in a word file 44254 - Avoid some unread byte warnings, and properly understand DVALRecord diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 8221954c0..69190f915 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 44296 - Fix for reading slide background images 44293 - Avoid swapping AreaPtgs from relative to absolute 44292 - Correctly process the last paragraph in a word file 44254 - Avoid some unread byte warnings, and properly understand DVALRecord diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java b/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java index 7eae4edc4..f9cc43a7e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java @@ -23,6 +23,8 @@ import org.apache.poi.hslf.record.*; import org.apache.poi.hslf.usermodel.PictureData; import org.apache.poi.hslf.usermodel.SlideShow; import org.apache.poi.hslf.exceptions.HSLFException; +import org.apache.poi.util.POILogger; +import org.apache.poi.util.POILogFactory; import java.awt.*; import java.util.*; @@ -33,6 +35,9 @@ import java.util.*; * @author Yegor Kozlov */ public class Fill { + // For logging + protected POILogger logger = POILogFactory.getLogger(this.getClass()); + /** * Fill with a solid color */ @@ -208,15 +213,18 @@ public class Fill { java.util.List lst = bstore.getChildRecords(); int idx = p.getPropertyValue(); - EscherBSERecord bse = (EscherBSERecord)lst.get(idx); - for ( int i = 0; i < pict.length; i++ ) { - if (pict[i].getOffset() == bse.getOffset()){ - return pict[i]; + if (idx == 0){ + logger.log(POILogger.ERROR, "no reference to picture data found "); + } else { + EscherBSERecord bse = (EscherBSERecord)lst.get(idx - 1); + for ( int i = 0; i < pict.length; i++ ) { + if (pict[i].getOffset() == bse.getOffset()){ + return pict[i]; + } } } - throw new HSLFException("Picture data not found: \n" + - " bse: " + bse + " at " + bse.getOffset() ); + return null; } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java b/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java index 0740e23bc..90efd5f3e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java @@ -109,7 +109,7 @@ public class Picture extends SimpleShape { */ public int getPictureIndex(){ EscherOptRecord opt = (EscherOptRecord)getEscherChild(_escherContainer, EscherOptRecord.RECORD_ID); - EscherSimpleProperty prop = (EscherSimpleProperty)getEscherProperty(opt, EscherProperties.BLIP__BLIPTODISPLAY + 0x4000); + EscherSimpleProperty prop = (EscherSimpleProperty)getEscherProperty(opt, EscherProperties.BLIP__BLIPTODISPLAY); return prop == null ? 0 : prop.getPropertyValue(); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java b/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java index 56d77764e..5cff81a8d 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java @@ -227,7 +227,7 @@ public abstract class Shape { for ( Iterator iterator = opt.getEscherProperties().iterator(); iterator.hasNext(); ) { EscherProperty prop = (EscherProperty) iterator.next(); - if (prop.getId() == propId) + if (prop.getPropertyNumber() == propId) return prop; } return null; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java b/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java index 201a069fc..ea7201751 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java @@ -262,4 +262,11 @@ public class Slide extends Sheet SlideAtom sa = getSlideRecord().getSlideAtom(); return sa.getFollowMasterBackground(); } + + public Background getBackground() { + if(getFollowMasterBackground()) + return getMasterSheet().getBackground(); + else + return super.getBackground(); + } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/44296.ppt b/src/scratchpad/testcases/org/apache/poi/hslf/data/44296.ppt new file mode 100755 index 000000000..1e0529db1 Binary files /dev/null and b/src/scratchpad/testcases/org/apache/poi/hslf/data/44296.ppt differ diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java index 996a733ac..f3f5f8e7e 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java @@ -330,4 +330,24 @@ public class TestBugs extends TestCase { assertEquals(tr1[i].getText(), tr2[i].getText()); } } + + /** + * Bug 44296: HSLF Not Extracting Slide Background Image + */ + public void test44296 () throws Exception { + FileInputStream is = new FileInputStream(new File(cwd, "44296.ppt")); + SlideShow ppt = new SlideShow(is); + is.close(); + + Slide slide = ppt.getSlides()[0]; + + Background b = slide.getBackground(); + Fill f = b.getFill(); + assertEquals(Fill.FILL_PICTURE, f.getFillType()); + + PictureData pict = f.getPictureData(); + assertNotNull(pict); + assertEquals(Picture.JPEG, pict.getType()); + } + }