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 af40b590b..5405b7f6e 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -251,6 +251,7 @@ implements SlideShow { slideId.setId2(rp.getRelationship().getId()); layout.copyLayout(slide); + slide.getPackagePart().clearRelationships(); slide.addRelation(null, XSLFRelation.SLIDE_LAYOUT, layout); _slides.add(slide); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java index 65939eec4..6f8fd2121 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java @@ -16,6 +16,27 @@ ==================================================================== */ package org.apache.poi.xslf; +import static org.apache.poi.POITestCase.assertContains; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.util.Collection; + +import javax.imageio.ImageIO; + import org.apache.poi.POIDataSamples; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart.RelationPart; @@ -29,28 +50,28 @@ import org.apache.poi.sl.usermodel.PictureData.PictureType; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor; -import org.apache.poi.xslf.usermodel.*; +import org.apache.poi.xslf.usermodel.XMLSlideShow; +import org.apache.poi.xslf.usermodel.XSLFAutoShape; +import org.apache.poi.xslf.usermodel.XSLFGroupShape; +import org.apache.poi.xslf.usermodel.XSLFHyperlink; +import org.apache.poi.xslf.usermodel.XSLFNotes; +import org.apache.poi.xslf.usermodel.XSLFPictureData; +import org.apache.poi.xslf.usermodel.XSLFPictureShape; +import org.apache.poi.xslf.usermodel.XSLFRelation; +import org.apache.poi.xslf.usermodel.XSLFShape; +import org.apache.poi.xslf.usermodel.XSLFSlide; +import org.apache.poi.xslf.usermodel.XSLFSlideLayout; +import org.apache.poi.xslf.usermodel.XSLFSlideMaster; +import org.apache.poi.xslf.usermodel.XSLFTable; +import org.apache.poi.xslf.usermodel.XSLFTableCell; +import org.apache.poi.xslf.usermodel.XSLFTableRow; +import org.apache.poi.xslf.usermodel.XSLFTextParagraph; +import org.apache.poi.xslf.usermodel.XSLFTextRun; import org.junit.Ignore; import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect; import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; -import javax.imageio.ImageIO; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.util.Collection; - -import static org.apache.poi.POITestCase.assertContains; -import static org.junit.Assert.*; - public class TestXSLFBugs { private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); @@ -58,24 +79,24 @@ public class TestXSLFBugs { @Test public void bug51187() throws Exception { XMLSlideShow ss1 = XSLFTestDataSamples.openSampleDocument("51187.pptx"); - + assertEquals(1, ss1.getSlides().size()); - + // Check the relations on it // Note - rId3 is a self reference XSLFSlide slide0 = ss1.getSlides().get(0); - + assertRelation(slide0, "/ppt/slides/slide1.xml", null); assertRelation(slide0, "/ppt/slideLayouts/slideLayout12.xml", "rId1"); assertRelation(slide0, "/ppt/notesSlides/notesSlide1.xml", "rId2"); assertRelation(slide0, "/ppt/slides/slide1.xml", "rId3"); assertRelation(slide0, "/ppt/media/image1.png", "rId4"); - + // Save and re-load XMLSlideShow ss2 = XSLFTestDataSamples.writeOutAndReadBack(ss1); ss1.close(); assertEquals(1, ss2.getSlides().size()); - + slide0 = ss2.getSlides().get(0); assertRelation(slide0, "/ppt/slides/slide1.xml", null); assertRelation(slide0, "/ppt/slideLayouts/slideLayout12.xml", "rId1"); @@ -83,30 +104,30 @@ public class TestXSLFBugs { // TODO Fix this assertRelation(slide0, "/ppt/slides/slide1.xml", "rId3"); assertRelation(slide0, "/ppt/media/image1.png", "rId4"); - + ss2.close(); } - + private static void assertRelation(XSLFSlide slide, String exp, String rId) { POIXMLDocumentPart pd = (rId != null) ? slide.getRelationById(rId) : slide; assertNotNull(pd); assertEquals(exp, pd.getPackagePart().getPartName().getName()); } - + /** * Slide relations with anchors in them */ @Test public void tika705() throws Exception { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("with_japanese.pptx"); - + // Should have one slide assertEquals(1, ss.getSlides().size()); XSLFSlide slide = ss.getSlides().get(0); - + // Check the relations from this Collection rels = slide.getRelationParts(); - + // Should have 6 relations: // 1 external hyperlink (skipped from list) // 4 internal hyperlinks @@ -123,7 +144,7 @@ public class TestXSLFBugs { } assertEquals(1, layouts); assertEquals(4, hyperlinks); - + // Hyperlinks should all be to #_ftn1 or #ftnref1 for(RelationPart p : rels) { if(p.getRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) { @@ -140,61 +161,61 @@ public class TestXSLFBugs { } ss.close(); } - + /** - * A slideshow can have more than one rID pointing to a given - * slide, eg presentation.xml rID1 -> slide1.xml, but slide1.xml + * A slideshow can have more than one rID pointing to a given + * slide, eg presentation.xml rID1 -> slide1.xml, but slide1.xml * rID2 -> slide3.xml */ @Test public void bug54916() throws Exception { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("OverlappingRelations.pptx"); - XSLFSlide slide; - + XSLFSlide slide; + // Should find 4 slides assertEquals(4, ss.getSlides().size()); - + // Check the text, to see we got them in order slide = ss.getSlides().get(0); assertContains(getSlideText(slide), "POI cannot read this"); - + slide = ss.getSlides().get(1); assertContains(getSlideText(slide), "POI can read this"); assertContains(getSlideText(slide), "Has a relationship to another slide"); - + slide = ss.getSlides().get(2); assertContains(getSlideText(slide), "POI can read this"); - + slide = ss.getSlides().get(3); assertContains(getSlideText(slide), "POI can read this"); - + ss.close(); } - + /** - * When the picture is not embedded but inserted only as a "link to file", + * When the picture is not embedded but inserted only as a "link to file", * there is no data available and XSLFPictureShape.getPictureData() * gives a NPE, see bug #56812 */ @Test public void bug56812() throws Exception { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("56812.pptx"); - + int internalPictures = 0; int externalPictures = 0; for (XSLFSlide slide : ppt.getSlides()){ for (XSLFShape shape : slide.getShapes()){ assertNotNull(shape); - + if (shape instanceof XSLFPictureShape) { XSLFPictureShape picture = (XSLFPictureShape)shape; if (picture.isExternalLinkedPicture()) { externalPictures++; - + assertNotNull(picture.getPictureLink()); } else { internalPictures++; - + XSLFPictureData data = picture.getPictureData(); assertNotNull(data); assertNotNull(data.getFileName()); @@ -202,7 +223,7 @@ public class TestXSLFBugs { } } } - + assertEquals(2, internalPictures); assertEquals(1, externalPictures); ppt.close(); @@ -212,31 +233,31 @@ public class TestXSLFBugs { @Ignore("Similar to TestFontRendering it doesn't make sense to compare images because of tiny rendering differences in windows/unix") public void bug54542() throws Exception { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("54542_cropped_bitmap.pptx"); - + Dimension pgsize = ss.getPageSize(); - + XSLFSlide slide = ss.getSlides().get(0); - + // render it double zoom = 1; AffineTransform at = new AffineTransform(); at.setToScale(zoom, zoom); - + BufferedImage imgActual = new BufferedImage((int)Math.ceil(pgsize.width*zoom), (int)Math.ceil(pgsize.height*zoom), BufferedImage.TYPE_3BYTE_BGR); Graphics2D graphics = imgActual.createGraphics(); graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); - graphics.setTransform(at); + graphics.setTransform(at); graphics.setPaint(Color.white); graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height)); - slide.draw(graphics); - + slide.draw(graphics); + ImageIO.write(imgActual, "PNG", new File("bug54542.png")); ss.close(); } - + protected String getSlideText(XSLFSlide slide) { return XSLFPowerPointExtractor.getText(slide, true, false, false); } @@ -267,7 +288,7 @@ public class TestXSLFBugs { validateSlides(ss, true, "Slide1","Slide2","New slide"); ss.close(); } - + /** * When working with >9 images, make sure the sorting ensures * that image10.foo isn't between image1.foo and image2.foo @@ -278,15 +299,15 @@ public class TestXSLFBugs { for (String s : new String[]{"Slide1","Slide2"}) { ss.createSlide().createTextBox().setText(s); } - + // Slide starts with just layout relation XSLFSlide slide = ss.getSlides().get(0); assertEquals(0, ss.getPictureData().size()); assertEquals(1, slide.getShapes().size()); - + assertEquals(1, slide.getRelations().size()); assertRelationEquals(XSLFRelation.SLIDE_LAYOUT, slide.getRelations().get(0)); - + // Some dummy pictures byte[][] pics = new byte[15][3]; for (int i=0; i