diff --git a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java index 966ebe7fd4..ddf9c7520e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java @@ -248,25 +248,42 @@ public class HSLFSlideShow extends POIDocument // As we go along, update, and hand over, to any Position Dependent // records we happen across Hashtable oldToNewPositions = new Hashtable(); - - // Write ourselves out + + // First pass - figure out where all the position dependent + // records are going to end up, in the new scheme + // (Annoyingly, some powerpoing files have PersistPtrHolders + // that reference slides after the PersistPtrHolder) ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for(int i=0; i<_records.length; i++) { + if(_records[i] instanceof PositionDependentRecord) { + PositionDependentRecord pdr = (PositionDependentRecord)_records[i]; + int oldPos = pdr.getLastOnDiskOffset(); + int newPos = baos.size(); + pdr.setLastOnDiskOffset(newPos); + oldToNewPositions.put(new Integer(oldPos),new Integer(newPos)); + //System.out.println(oldPos + " -> " + newPos); + } + + // Dummy write out, so the position winds on properly + _records[i].writeOut(baos); + } + + // No go back through, actually writing ourselves out + baos.reset(); for(int i=0; i<_records.length; i++) { // For now, we're only handling PositionDependentRecord's that // happen at the top level. // In future, we'll need the handle them everywhere, but that's // a bit trickier if(_records[i] instanceof PositionDependentRecord) { + // We've already figured out their new location, and + // told them that + // Tell them of the positions of the other records though PositionDependentRecord pdr = (PositionDependentRecord)_records[i]; - int oldPos = pdr.getLastOnDiskOffset(); - int newPos = baos.size(); - pdr.setLastOnDiskOffset(newPos); - //System.out.println(i + " " + oldPos + " " + newPos); - oldToNewPositions.put(new Integer(oldPos),new Integer(newPos)); pdr.updateOtherRecordReferences(oldToNewPositions); } - // Finally, write out + // Whatever happens, write out that record tree _records[i].writeOut(baos); } // Update our cached copy of the bytes that make up the PPT stream diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java b/src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java index bdf6251c29..418e4ed539 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java @@ -192,7 +192,9 @@ public class PersistPtrHolder extends PositionDependentRecordAtom Integer newPos = (Integer)oldToNewReferencesLookup.get(oldPos); if(newPos == null) { - throw new RuntimeException("Couldn't find the new location of the \"slide\" that used to be at " + oldPos); + System.err.println("Couldn't find the new location of the \"slide\" with id " + id + " that used to be at " + oldPos); + System.err.println("Not updating the position of it, you probably won't be able to find it any more (if you ever could!)"); + newPos = oldPos; } // Write out the new location