diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java index 4a1d4c8a0e..c12e791a2e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java @@ -417,7 +417,7 @@ public class TextRun } // Create a new one at the right size - _styleAtom = new StyleTextPropAtom(getRawText().length()); + _styleAtom = new StyleTextPropAtom(getRawText().length() + 1); // Use the TextHeader atom to get at the parent RecordContainer runAtomsParent = _headerAtom.getParentRecord(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java index f891bc159a..2223a7ee03 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java @@ -228,7 +228,8 @@ public class StyleTextPropAtom extends RecordAtom // While we have text in need of paragraph stylings, go ahead and // grok the contents as paragraph formatting data - while(pos < rawContents.length && textHandled < size) { + int prsize = size; + while(pos < rawContents.length && textHandled < prsize) { // First up, fetch the number of characters this applies to int textLen = LittleEndian.getInt(rawContents,pos); textHandled += textLen; @@ -250,11 +251,21 @@ public class StyleTextPropAtom extends RecordAtom // Save this properties set paragraphStyles.add(thisCollection); + + // Handle extra 1 paragraph styles at the end + if(pos < rawContents.length && textHandled == size) { + prsize++; + } + } + if (rawContents.length > 0 && textHandled != (size+1)){ + System.err.println("Problem reading paragraph style runs: textHandled = " + textHandled + ", text.size+1 = " + (size+1)); + } // Now do the character stylings textHandled = 0; - while(pos < rawContents.length && textHandled < size) { + int chsize = size; + while(pos < rawContents.length && textHandled < chsize) { // First up, fetch the number of characters this applies to int textLen = LittleEndian.getInt(rawContents,pos); textHandled += textLen; @@ -279,9 +290,12 @@ public class StyleTextPropAtom extends RecordAtom // Handle extra 1 char styles at the end if(pos < rawContents.length && textHandled == size) { - size++; + chsize++; } } + if (rawContents.length > 0 && textHandled != (size+1)){ + System.err.println("Problem reading character style runs: textHandled = " + textHandled + ", text.size+1 = " + (size+1)); + } // Handle anything left over if(pos < rawContents.length) { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java index 1faae21d8e..674da9d175 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java @@ -49,7 +49,7 @@ public class TestStyleTextPropAtom extends TestCase { 00, 00, 0x04, 00, // font.color only 0xFF-256, 0x33, 00, 0xFE-256 // red }; - private int data_a_text_len = 54; + private int data_a_text_len = 0x36-1; /** * From a real file: 4 paragraphs with text in 4 different styles: @@ -125,7 +125,7 @@ public class TestStyleTextPropAtom extends TestCase { 28, 0, 1, 0, 0, 0, 0, 0, 3, 0, 1, 0, 24, 0 }; - private int data_c_text_len = 123; + private int data_c_text_len = 123-1; public void testRecordType() throws Exception {