Lines 20-41
Link Here
|
20 |
package org.apache.poi.hslf.usermodel; |
20 |
package org.apache.poi.hslf.usermodel; |
21 |
|
21 |
|
22 |
import java.util.*; |
22 |
import java.util.*; |
|
|
23 |
import java.util.List; |
23 |
import java.io.*; |
24 |
import java.io.*; |
|
|
25 |
import java.awt.*; |
24 |
|
26 |
|
25 |
import org.apache.poi.util.LittleEndian; |
27 |
import org.apache.poi.util.LittleEndian; |
26 |
|
28 |
|
27 |
import org.apache.poi.hslf.*; |
29 |
import org.apache.poi.hslf.*; |
28 |
import org.apache.poi.hslf.model.*; |
30 |
import org.apache.poi.hslf.model.*; |
29 |
import org.apache.poi.hslf.record.FontCollection; |
31 |
import org.apache.poi.hslf.model.Notes; |
30 |
import org.apache.poi.hslf.record.ParentAwareRecord; |
32 |
import org.apache.poi.hslf.model.Slide; |
31 |
import org.apache.poi.hslf.record.Record; |
|
|
32 |
import org.apache.poi.hslf.record.RecordContainer; |
33 |
import org.apache.poi.hslf.record.RecordTypes; |
34 |
import org.apache.poi.hslf.record.SlideAtom; |
35 |
import org.apache.poi.hslf.record.SlideListWithText; |
36 |
import org.apache.poi.hslf.record.SlideListWithText.*; |
33 |
import org.apache.poi.hslf.record.SlideListWithText.*; |
37 |
import org.apache.poi.hslf.record.PersistPtrHolder; |
34 |
import org.apache.poi.hslf.record.*; |
38 |
import org.apache.poi.hslf.record.PositionDependentRecord; |
|
|
39 |
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException; |
35 |
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException; |
40 |
|
36 |
|
41 |
/** |
37 |
/** |
Lines 93-100
Link Here
|
93 |
// Build up the model level Slides and Notes |
89 |
// Build up the model level Slides and Notes |
94 |
buildSlidesAndNotes(); |
90 |
buildSlidesAndNotes(); |
95 |
} |
91 |
} |
96 |
|
92 |
|
97 |
|
|
|
98 |
/** |
93 |
/** |
99 |
* Find the records that are parent-aware, and tell them |
94 |
* Find the records that are parent-aware, and tell them |
100 |
* who their parent is |
95 |
* who their parent is |
Lines 398-401
Link Here
|
398 |
public Picture[] getPictures() throws IOException { |
393 |
public Picture[] getPictures() throws IOException { |
399 |
return _hslfSlideShow.getPictures(); |
394 |
return _hslfSlideShow.getPictures(); |
400 |
} |
395 |
} |
|
|
396 |
|
397 |
/** |
398 |
* Create a blank <code>Slide</code>. |
399 |
* |
400 |
* @return the created <code>Slide</code> |
401 |
* @throws IOException |
402 |
*/ |
403 |
public Slide createSlide() throws IOException { |
404 |
RecordContainer doc = null; //find document record |
405 |
for (int i = 0; i < _mostRecentCoreRecords.length; i++) { |
406 |
Record record = _records[i]; |
407 |
if (record.getRecordType() == RecordTypes.Document.typeID){ |
408 |
doc = (RecordContainer)record; |
409 |
break; |
410 |
} |
411 |
} |
412 |
|
413 |
RecordContainer slist=null; |
414 |
Record[] rec = doc.getChildRecords(); |
415 |
int num = 0; |
416 |
for (int i = 0; i < rec.length; i++) { |
417 |
Record record = rec[i]; |
418 |
if (record.getRecordType() == RecordTypes.SlideListWithText.typeID){ |
419 |
if (num > 0){ |
420 |
slist = (RecordContainer)record; |
421 |
} |
422 |
num++; |
423 |
} |
424 |
} |
425 |
if (num == 1){ |
426 |
slist = new SlideListWithText(); |
427 |
rec = doc.getChildRecords(); |
428 |
for (int i = 0; i < rec.length-1; i++) { |
429 |
Record record = rec[i+1]; |
430 |
if (record.getRecordType() == RecordTypes.EndDocument.typeID){ |
431 |
|
432 |
doc.addChildAfter(slist, rec[i]); |
433 |
} |
434 |
} |
435 |
} |
436 |
rec = slist.getChildRecords(); |
437 |
|
438 |
//add SlidePersistAtom |
439 |
SlidePersistAtom prev = rec.length == 0 ? null : (SlidePersistAtom)rec[rec.length - 1]; |
440 |
SlidePersistAtom sp = new SlidePersistAtom(); |
441 |
|
442 |
//refernce is the 1-based index of the slide container in the document root. |
443 |
//it always starts with 3 (1 is Document, 2 is MainMaster, 3 is the first slide) |
444 |
sp.setRefID(prev == null ? 3 : (prev.getRefID() + 1)); |
445 |
//first slideId is always 256 |
446 |
sp.setSlideIdentifier(prev == null ? 256 : (prev.getSlideIdentifier() + 1)); |
447 |
|
448 |
Record[] r = slist.appendChildRecord(sp, |
449 |
slist.getChildRecords() == null ? new Record[]{} : slist.getChildRecords()); |
450 |
slist.setChildRecords(r); |
451 |
Slide slide = new Slide(); |
452 |
|
453 |
int offset = 0; |
454 |
List lst = new ArrayList(); |
455 |
for (int i = 0; i < _records.length; i++) { |
456 |
Record record = _records[i]; |
457 |
lst.add(record); |
458 |
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
459 |
record.writeOut(out); |
460 |
|
461 |
if (_records[i].getRecordType() == RecordTypes.PersistPtrIncrementalBlock.typeID){ |
462 |
lst.add(i, slide.getSlideRecord()); |
463 |
|
464 |
slide.getSlideRecord().setLastOnDiskOffset(offset); |
465 |
PersistPtrHolder ptr = (PersistPtrHolder)_records[i]; |
466 |
int id = sp.getRefID(); |
467 |
ptr.getSlideDataLocationsLookup().put(new Integer(id), new Integer((i+1)*4)); |
468 |
ptr.getSlideLocationsLookup().put(new Integer(id), new Integer(offset)); |
469 |
ptr.addSlideLookup(id, offset); |
470 |
|
471 |
} |
472 |
offset += out.size() ; |
473 |
} |
474 |
_records = (Record[])lst.toArray(new Record[lst.size()]); |
475 |
_hslfSlideShow.setRecords(_records); |
476 |
|
477 |
UserEditAtom usr = (UserEditAtom)_records[_records.length-1]; |
478 |
usr.setLastViewType((short)UserEditAtom.LAST_VIEW_SLIDE_VIEW); |
479 |
return slide; |
480 |
} |
481 |
|
482 |
public Dimension getPageSize(){ |
483 |
RecordContainer doc = null; //find document record |
484 |
for (int i = 0; i < _mostRecentCoreRecords.length; i++) { |
485 |
Record record = _records[i]; |
486 |
if (record.getRecordType() == RecordTypes.Document.typeID){ |
487 |
doc = (RecordContainer)record; |
488 |
break; |
489 |
} |
490 |
} |
491 |
DocumentAtom docatom = (DocumentAtom)doc.getChildRecords()[0]; |
492 |
return new Dimension((int)docatom.getSlideSizeX(), (int)docatom.getSlideSizeY()); |
493 |
} |
401 |
} |
494 |
} |