Index: src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java =================================================================== --- src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java (revision 494777) +++ src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java (working copy) @@ -417,7 +417,7 @@ } // 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(); Index: src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java =================================================================== --- src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java (revision 494777) +++ src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java (working copy) @@ -228,7 +228,8 @@ // 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 @@ // 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 @@ // 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) { Index: src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java =================================================================== --- src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java (revision 494777) +++ src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java (working copy) @@ -49,7 +49,7 @@ 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 @@ 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 {