diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index d022450cbe..43a7d6ac58 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -72,7 +72,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument @Beta public class XMLSlideShow extends POIXMLDocument implements SlideShow { - private final static POILogger _logger = POILogFactory.getLogger(XMLSlideShow.class); + private static final POILogger LOG = POILogFactory.getLogger(XMLSlideShow.class); private CTPresentation _presentation; private List _slides; @@ -154,7 +154,7 @@ implements SlideShow { for (CTSlideIdListEntry slId : _presentation.getSldIdLst().getSldIdList()) { XSLFSlide sh = shIdMap.get(slId.getId2()); 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; } _slides.add(sh); @@ -206,8 +206,9 @@ implements SlideShow { public XSLFSlide createSlide(XSLFSlideLayout layout) { int slideNumber = 256, cnt = 1; CTSlideIdList slideList; - if (!_presentation.isSetSldIdLst()) slideList = _presentation.addNewSldIdLst(); - else { + if (!_presentation.isSetSldIdLst()) { + slideList = _presentation.addNewSldIdLst(); + } else { slideList = _presentation.getSldIdLst(); for(CTSlideIdListEntry slideId : slideList.getSldIdArray()){ slideNumber = (int)Math.max(slideId.getId() + 1, slideNumber); @@ -255,31 +256,39 @@ implements SlideShow { _slides.add(slide); return slide; } - + /** * Create a blank slide using the default (first) master. */ @Override public XSLFSlide createSlide() { - XSLFSlideLayout layout = _masters.get(0).getLayout(SlideLayout.BLANK); - if(layout == null) throw new IllegalArgumentException("Blank layout was not found"); - + XSLFSlideMaster sm = _masters.get(0); + 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 notes slide for the specified slide or create new if it does not exist yet. */ public XSLFNotes getNotesSlide(XSLFSlide slide) { - + XSLFNotes notesSlide = slide.getNotes(); if (notesSlide == null) { notesSlide = createNotesSlide(slide); } - + return notesSlide; - } - + } + /** * Create a blank notes slide. */ @@ -288,10 +297,10 @@ implements SlideShow { if (_notesMaster == null) { createNotesMaster(); } - + Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide); - - // add notes slide to presentation + + // add notes slide to presentation XSLFNotes notesSlide = (XSLFNotes) createRelationship (XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex); // link slide and notes slide with each other @@ -300,22 +309,22 @@ implements SlideShow { notesSlide.addRelation(null, XSLFRelation.SLIDE, slide); notesSlide.importContent(_notesMaster); - + return notesSlide; } /** * Create a notes master. - */ + */ public void createNotesMaster() { RelationPart rp = createRelationship (XSLFRelation.NOTES_MASTER, XSLFFactory.getInstance(), 1, false); _notesMaster = rp.getDocumentPart(); - + CTNotesMasterIdList notesMasterIdList = _presentation.addNewNotesMasterIdLst(); CTNotesMasterIdListEntry notesMasterId = notesMasterIdList.addNewNotesMasterId(); notesMasterId.setId(rp.getRelationship().getId()); - + Integer themeIndex = 1; // TODO: check if that list can be replaced by idx = Math.max(idx,themeIdx) List themeIndexList = new ArrayList(); @@ -324,7 +333,7 @@ implements SlideShow { themeIndexList.add(XSLFRelation.THEME.getFileNameIndex(p)); } } - + if (!themeIndexList.isEmpty()) { Boolean found = false; for (Integer i = 1; i <= themeIndexList.size(); i++) { @@ -337,20 +346,20 @@ implements SlideShow { themeIndex = themeIndexList.size() + 1; } } - + XSLFTheme theme = (XSLFTheme) createRelationship (XSLFRelation.THEME, XSLFFactory.getInstance(), themeIndex); theme.importTheme(getSlides().get(0).getTheme()); - + _notesMaster.addRelation(null, XSLFRelation.THEME, theme); } - + /** * 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() { - return _notesMaster; + return _notesMaster; } @Override @@ -361,10 +370,11 @@ implements SlideShow { /** * Return all the slides in the slideshow */ + @Override public List getSlides() { return _slides; } - + /** * Returns the list of comment authors, if there is one. * Will only be present if at least one slide has comments on it. @@ -379,8 +389,12 @@ implements SlideShow { */ public void setSlideOrder(XSLFSlide slide, int newIndex){ int oldIndex = _slides.indexOf(slide); - if(oldIndex == -1) throw new IllegalArgumentException("Slide not found"); - if (oldIndex == newIndex) return; + if(oldIndex == -1) { + throw new IllegalArgumentException("Slide not found"); + } + if (oldIndex == newIndex) { + return; + } // fix the usermodel container _slides.add(newIndex, _slides.remove(oldIndex)); @@ -404,7 +418,7 @@ implements SlideShow { _presentation.getSldIdLst().removeSldId(index); return slide; } - + @Override public Dimension getPageSize(){ CTSlideSize sz = _presentation.getSldSz(); @@ -424,7 +438,7 @@ implements SlideShow { @Internal public CTPresentation getCTPresentation(){ - return _presentation; + return _presentation; } /** @@ -435,11 +449,14 @@ implements SlideShow { * * @return the picture data */ + @Override public XSLFPictureData addPicture(byte[] pictureData, PictureType format) { XSLFPictureData img = findPictureData(pictureData); - if (img != null) return img; - + if (img != null) { + return img; + } + int imageNumber = _pictures.size(); XSLFRelation relType = XSLFPictureData.getRelationForType(format); if (relType == null) { @@ -455,7 +472,7 @@ implements SlideShow { } catch (IOException e) { throw new POIXMLException(e); } - + return img; } @@ -502,7 +519,7 @@ implements SlideShow { /** * check if a picture with this picture data already exists in this presentation - * + * * @param pictureData The picture data to find in the SlideShow * @return {@code null} if picture data is not found in this slideshow * @since 3.15 beta 2 @@ -560,6 +577,7 @@ implements SlideShow { throw new UnsupportedOperationException(); } + @Override public Resources getResources() { // TODO: implement! throw new UnsupportedOperationException(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java index 759bbf6fb5..ab25946169 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java @@ -71,7 +71,7 @@ import org.junit.Test; public class TestXSLFBugs { private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); - + @Test public void bug51187() throws Exception { XMLSlideShow ss1 = XSLFTestDataSamples.openSampleDocument("51187.pptx"); @@ -586,4 +586,10 @@ public class TestXSLFBugs { return cell; } + @Test + public void bug60715() throws IOException { + XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("bug60715.pptx"); + ppt.createSlide(); + ppt.close(); + } } \ No newline at end of file diff --git a/test-data/slideshow/bug60715.pptx b/test-data/slideshow/bug60715.pptx new file mode 100644 index 0000000000..16f018a0bc Binary files /dev/null and b/test-data/slideshow/bug60715.pptx differ