diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java index 3668862170..d1046a1f04 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java @@ -93,13 +93,13 @@ public class TabStopPropCollection extends TextProp { */ public void parseProperty(byte data[], int offset) { int count = LittleEndian.getUShort(data, offset); - offset += LittleEndianConsts.SHORT_SIZE; + int off = offset + LittleEndianConsts.SHORT_SIZE; for (int i=0; i(); + for (TabStop ts : tabStops) { + TabStop tso = new TabStop(ts.getPosition(), ts.getType()); + other.tabStops.add(tso); + } + return other; + } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java index 07d663b4a9..e95cdfd29c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java @@ -98,6 +98,7 @@ public class TextProp implements Cloneable { } } + @Override public int hashCode() { final int prime = 31; int result = 1; @@ -108,6 +109,7 @@ public class TextProp implements Cloneable { return result; } + @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; @@ -121,4 +123,15 @@ public class TextProp implements Cloneable { if (sizeOfDataBlock != other.sizeOfDataBlock) return false; return true; } + + @Override + public String toString() { + int len; + switch (sizeOfDataBlock) { + case 1: len = 4; break; + case 2: len = 6; break; + default: len = 10; break; + } + return String.format("%s = %d (%0#"+len+"X mask / %d bytes)", propName, dataValue, maskInHeader, sizeOfDataBlock); + } } \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java index 09415a01c3..cf45cc790f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java @@ -214,13 +214,11 @@ public class TextPropCollection { // Bingo, data contains this property TextProp prop = tp.clone(); int val = 0; - if (prop instanceof TabStopPropCollection) { - ((TabStopPropCollection)prop).parseProperty(data, dataOffset+bytesPassed); - } else if (prop.getSize() == 2) { + if (prop.getSize() == 2) { val = LittleEndian.getShort(data,dataOffset+bytesPassed); } else if(prop.getSize() == 4) { val = LittleEndian.getInt(data,dataOffset+bytesPassed); - } else if (prop.getSize() == 0) { + } else if (prop.getSize() == 0 && !(prop instanceof TabStopPropCollection)) { //remember "special" bits. maskSpecial |= tp.getMask(); continue; @@ -228,6 +226,8 @@ public class TextPropCollection { if (prop instanceof BitMaskTextProp) { ((BitMaskTextProp)prop).setValueWithMask(val, containsField); + } else if (prop instanceof TabStopPropCollection) { + ((TabStopPropCollection)prop).parseProperty(data, dataOffset+bytesPassed); } else { prop.setValue(val); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java index 2d9541e1bd..6d1c4873d7 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java @@ -144,7 +144,7 @@ public final class TxMasterStyleAtom extends RecordAtom { charStyles = new ArrayList(levels); for(short i = 0; i < levels; i++) { - TextPropCollection prprops = new TextPropCollection(0, TextPropType.paragraph); // getParagraphProps(type, j) + TextPropCollection prprops = new TextPropCollection(0, TextPropType.paragraph); if (type >= TextHeaderAtom.CENTRE_BODY_TYPE) { // Fetch the 2 byte value, that is safe to ignore for some types of text short indentLevel = LittleEndian.getShort(_data, pos); @@ -162,7 +162,7 @@ public final class TxMasterStyleAtom extends RecordAtom { head = LittleEndian.getInt(_data, pos); pos += LittleEndian.INT_SIZE; - TextPropCollection chprops = new TextPropCollection(0, TextPropType.character); // getCharacterProps(type, j) + TextPropCollection chprops = new TextPropCollection(0, TextPropType.character); pos += chprops.buildTextPropList( head, _data, pos); charStyles.add(chprops); } 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 067f6ca916..6e11a41b54 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java @@ -39,6 +39,7 @@ import org.apache.poi.ddf.EscherColorRef; import org.apache.poi.ddf.EscherProperties; import org.apache.poi.hslf.HSLFTestDataSamples; import org.apache.poi.hslf.exceptions.OldPowerPointFormatException; +import org.apache.poi.hslf.extractor.PowerPointExtractor; import org.apache.poi.hslf.model.HeadersFooters; import org.apache.poi.hslf.record.Document; import org.apache.poi.hslf.record.Record; @@ -756,6 +757,17 @@ public final class TestBugs { assertEquals("foobaa", tr.getRawText()); ppt2.close(); } + + @Test + public void bug58718() throws IOException { + String files[] = { "bug58718_008524.ppt","bug58718_008558.ppt","bug58718_349008.ppt","bug58718_008495.ppt", }; + for (String f : files) { + File sample = HSLFTestDataSamples.getSampleFile(f); + PowerPointExtractor ex = new PowerPointExtractor(sample.getAbsolutePath()); + assertNotNull(ex.getText()); + ex.close(); + } + } private static HSLFSlideShow open(String fileName) throws IOException { File sample = HSLFTestDataSamples.getSampleFile(fileName); diff --git a/test-data/slideshow/bug58718_008495.ppt b/test-data/slideshow/bug58718_008495.ppt new file mode 100644 index 0000000000..9d9009a867 Binary files /dev/null and b/test-data/slideshow/bug58718_008495.ppt differ diff --git a/test-data/slideshow/bug58718_008524.ppt b/test-data/slideshow/bug58718_008524.ppt new file mode 100644 index 0000000000..96eddb7729 Binary files /dev/null and b/test-data/slideshow/bug58718_008524.ppt differ diff --git a/test-data/slideshow/bug58718_008558.ppt b/test-data/slideshow/bug58718_008558.ppt new file mode 100644 index 0000000000..c8a6d52795 Binary files /dev/null and b/test-data/slideshow/bug58718_008558.ppt differ diff --git a/test-data/slideshow/bug58718_349008.ppt b/test-data/slideshow/bug58718_349008.ppt new file mode 100644 index 0000000000..41d9759b1d Binary files /dev/null and b/test-data/slideshow/bug58718_349008.ppt differ