#60715 - Blank layout was not found

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1782635 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2017-02-11 21:48:05 +00:00
parent faaa94d20a
commit 397771011f
3 changed files with 60 additions and 36 deletions

View File

@ -72,7 +72,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument
@Beta @Beta
public class XMLSlideShow extends POIXMLDocument public class XMLSlideShow extends POIXMLDocument
implements SlideShow<XSLFShape,XSLFTextParagraph> { implements SlideShow<XSLFShape,XSLFTextParagraph> {
private final static POILogger _logger = POILogFactory.getLogger(XMLSlideShow.class); private static final POILogger LOG = POILogFactory.getLogger(XMLSlideShow.class);
private CTPresentation _presentation; private CTPresentation _presentation;
private List<XSLFSlide> _slides; private List<XSLFSlide> _slides;
@ -154,7 +154,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
for (CTSlideIdListEntry slId : _presentation.getSldIdLst().getSldIdList()) { for (CTSlideIdListEntry slId : _presentation.getSldIdLst().getSldIdList()) {
XSLFSlide sh = shIdMap.get(slId.getId2()); XSLFSlide sh = shIdMap.get(slId.getId2());
if (sh == null) { if (sh == null) {
_logger.log(POILogger.WARN, "Slide with r:id " + slId.getId() + " was defined, but didn't exist in package, skipping"); LOG.log(POILogger.WARN, "Slide with r:id " + slId.getId() + " was defined, but didn't exist in package, skipping");
continue; continue;
} }
_slides.add(sh); _slides.add(sh);
@ -206,8 +206,9 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
public XSLFSlide createSlide(XSLFSlideLayout layout) { public XSLFSlide createSlide(XSLFSlideLayout layout) {
int slideNumber = 256, cnt = 1; int slideNumber = 256, cnt = 1;
CTSlideIdList slideList; CTSlideIdList slideList;
if (!_presentation.isSetSldIdLst()) slideList = _presentation.addNewSldIdLst(); if (!_presentation.isSetSldIdLst()) {
else { slideList = _presentation.addNewSldIdLst();
} else {
slideList = _presentation.getSldIdLst(); slideList = _presentation.getSldIdLst();
for(CTSlideIdListEntry slideId : slideList.getSldIdArray()){ for(CTSlideIdListEntry slideId : slideList.getSldIdArray()){
slideNumber = (int)Math.max(slideId.getId() + 1, slideNumber); slideNumber = (int)Math.max(slideId.getId() + 1, slideNumber);
@ -255,31 +256,39 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
_slides.add(slide); _slides.add(slide);
return slide; return slide;
} }
/** /**
* Create a blank slide using the default (first) master. * Create a blank slide using the default (first) master.
*/ */
@Override @Override
public XSLFSlide createSlide() { public XSLFSlide createSlide() {
XSLFSlideLayout layout = _masters.get(0).getLayout(SlideLayout.BLANK); XSLFSlideMaster sm = _masters.get(0);
if(layout == null) throw new IllegalArgumentException("Blank layout was not found"); XSLFSlideLayout layout = sm.getLayout(SlideLayout.BLANK);
if (layout == null) {
LOG.log(POILogger.WARN, "Blank layout was not found - defaulting to first slide layout in master");
XSLFSlideLayout sl[] = sm.getSlideLayouts();
if (sl.length == 0) {
throw new POIXMLException("SlideMaster must contain a SlideLayout.");
}
layout = sl[0];
}
return createSlide(layout); return createSlide(layout);
} }
/** /**
* Return notes slide for the specified slide or create new if it does not exist yet. * Return notes slide for the specified slide or create new if it does not exist yet.
*/ */
public XSLFNotes getNotesSlide(XSLFSlide slide) { public XSLFNotes getNotesSlide(XSLFSlide slide) {
XSLFNotes notesSlide = slide.getNotes(); XSLFNotes notesSlide = slide.getNotes();
if (notesSlide == null) { if (notesSlide == null) {
notesSlide = createNotesSlide(slide); notesSlide = createNotesSlide(slide);
} }
return notesSlide; return notesSlide;
} }
/** /**
* Create a blank notes slide. * Create a blank notes slide.
*/ */
@ -288,10 +297,10 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
if (_notesMaster == null) { if (_notesMaster == null) {
createNotesMaster(); createNotesMaster();
} }
Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide); Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
// add notes slide to presentation // add notes slide to presentation
XSLFNotes notesSlide = (XSLFNotes) createRelationship XSLFNotes notesSlide = (XSLFNotes) createRelationship
(XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex); (XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex);
// link slide and notes slide with each other // link slide and notes slide with each other
@ -300,22 +309,22 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
notesSlide.addRelation(null, XSLFRelation.SLIDE, slide); notesSlide.addRelation(null, XSLFRelation.SLIDE, slide);
notesSlide.importContent(_notesMaster); notesSlide.importContent(_notesMaster);
return notesSlide; return notesSlide;
} }
/** /**
* Create a notes master. * Create a notes master.
*/ */
public void createNotesMaster() { public void createNotesMaster() {
RelationPart rp = createRelationship RelationPart rp = createRelationship
(XSLFRelation.NOTES_MASTER, XSLFFactory.getInstance(), 1, false); (XSLFRelation.NOTES_MASTER, XSLFFactory.getInstance(), 1, false);
_notesMaster = rp.getDocumentPart(); _notesMaster = rp.getDocumentPart();
CTNotesMasterIdList notesMasterIdList = _presentation.addNewNotesMasterIdLst(); CTNotesMasterIdList notesMasterIdList = _presentation.addNewNotesMasterIdLst();
CTNotesMasterIdListEntry notesMasterId = notesMasterIdList.addNewNotesMasterId(); CTNotesMasterIdListEntry notesMasterId = notesMasterIdList.addNewNotesMasterId();
notesMasterId.setId(rp.getRelationship().getId()); notesMasterId.setId(rp.getRelationship().getId());
Integer themeIndex = 1; Integer themeIndex = 1;
// TODO: check if that list can be replaced by idx = Math.max(idx,themeIdx) // TODO: check if that list can be replaced by idx = Math.max(idx,themeIdx)
List<Integer> themeIndexList = new ArrayList<Integer>(); List<Integer> themeIndexList = new ArrayList<Integer>();
@ -324,7 +333,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
themeIndexList.add(XSLFRelation.THEME.getFileNameIndex(p)); themeIndexList.add(XSLFRelation.THEME.getFileNameIndex(p));
} }
} }
if (!themeIndexList.isEmpty()) { if (!themeIndexList.isEmpty()) {
Boolean found = false; Boolean found = false;
for (Integer i = 1; i <= themeIndexList.size(); i++) { for (Integer i = 1; i <= themeIndexList.size(); i++) {
@ -337,20 +346,20 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
themeIndex = themeIndexList.size() + 1; themeIndex = themeIndexList.size() + 1;
} }
} }
XSLFTheme theme = (XSLFTheme) createRelationship XSLFTheme theme = (XSLFTheme) createRelationship
(XSLFRelation.THEME, XSLFFactory.getInstance(), themeIndex); (XSLFRelation.THEME, XSLFFactory.getInstance(), themeIndex);
theme.importTheme(getSlides().get(0).getTheme()); theme.importTheme(getSlides().get(0).getTheme());
_notesMaster.addRelation(null, XSLFRelation.THEME, theme); _notesMaster.addRelation(null, XSLFRelation.THEME, theme);
} }
/** /**
* Return the Notes Master, if there is one. * Return the Notes Master, if there is one.
* (May not be present if no notes exist) * (May not be present if no notes exist)
*/ */
public XSLFNotesMaster getNotesMaster() { public XSLFNotesMaster getNotesMaster() {
return _notesMaster; return _notesMaster;
} }
@Override @Override
@ -361,10 +370,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
/** /**
* Return all the slides in the slideshow * Return all the slides in the slideshow
*/ */
@Override
public List<XSLFSlide> getSlides() { public List<XSLFSlide> getSlides() {
return _slides; return _slides;
} }
/** /**
* Returns the list of comment authors, if there is one. * Returns the list of comment authors, if there is one.
* Will only be present if at least one slide has comments on it. * Will only be present if at least one slide has comments on it.
@ -379,8 +389,12 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
*/ */
public void setSlideOrder(XSLFSlide slide, int newIndex){ public void setSlideOrder(XSLFSlide slide, int newIndex){
int oldIndex = _slides.indexOf(slide); int oldIndex = _slides.indexOf(slide);
if(oldIndex == -1) throw new IllegalArgumentException("Slide not found"); if(oldIndex == -1) {
if (oldIndex == newIndex) return; throw new IllegalArgumentException("Slide not found");
}
if (oldIndex == newIndex) {
return;
}
// fix the usermodel container // fix the usermodel container
_slides.add(newIndex, _slides.remove(oldIndex)); _slides.add(newIndex, _slides.remove(oldIndex));
@ -404,7 +418,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
_presentation.getSldIdLst().removeSldId(index); _presentation.getSldIdLst().removeSldId(index);
return slide; return slide;
} }
@Override @Override
public Dimension getPageSize(){ public Dimension getPageSize(){
CTSlideSize sz = _presentation.getSldSz(); CTSlideSize sz = _presentation.getSldSz();
@ -424,7 +438,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
@Internal @Internal
public CTPresentation getCTPresentation(){ public CTPresentation getCTPresentation(){
return _presentation; return _presentation;
} }
/** /**
@ -435,11 +449,14 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
* *
* @return the picture data * @return the picture data
*/ */
@Override
public XSLFPictureData addPicture(byte[] pictureData, PictureType format) { public XSLFPictureData addPicture(byte[] pictureData, PictureType format) {
XSLFPictureData img = findPictureData(pictureData); XSLFPictureData img = findPictureData(pictureData);
if (img != null) return img; if (img != null) {
return img;
}
int imageNumber = _pictures.size(); int imageNumber = _pictures.size();
XSLFRelation relType = XSLFPictureData.getRelationForType(format); XSLFRelation relType = XSLFPictureData.getRelationForType(format);
if (relType == null) { if (relType == null) {
@ -455,7 +472,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
} catch (IOException e) { } catch (IOException e) {
throw new POIXMLException(e); throw new POIXMLException(e);
} }
return img; return img;
} }
@ -502,7 +519,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
/** /**
* check if a picture with this picture data already exists in this presentation * check if a picture with this picture data already exists in this presentation
* *
* @param pictureData The picture data to find in the SlideShow * @param pictureData The picture data to find in the SlideShow
* @return {@code null} if picture data is not found in this slideshow * @return {@code null} if picture data is not found in this slideshow
* @since 3.15 beta 2 * @since 3.15 beta 2
@ -560,6 +577,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public Resources getResources() { public Resources getResources() {
// TODO: implement! // TODO: implement!
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();

View File

@ -71,7 +71,7 @@ import org.junit.Test;
public class TestXSLFBugs { public class TestXSLFBugs {
private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
@Test @Test
public void bug51187() throws Exception { public void bug51187() throws Exception {
XMLSlideShow ss1 = XSLFTestDataSamples.openSampleDocument("51187.pptx"); XMLSlideShow ss1 = XSLFTestDataSamples.openSampleDocument("51187.pptx");
@ -586,4 +586,10 @@ public class TestXSLFBugs {
return cell; return cell;
} }
@Test
public void bug60715() throws IOException {
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("bug60715.pptx");
ppt.createSlide();
ppt.close();
}
} }

Binary file not shown.