211 lines
9.0 KiB
Java
211 lines
9.0 KiB
Java
/* ====================================================================
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
this work for additional information regarding copyright ownership.
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
(the "License"); you may not use this file except in compliance with
|
|
the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
==================================================================== */
|
|
package org.apache.poi.xslf.usermodel;
|
|
|
|
import static org.junit.Assert.assertArrayEquals;
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertFalse;
|
|
import static org.junit.Assert.assertNotNull;
|
|
import static org.junit.Assert.assertTrue;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import org.apache.poi.POIDataSamples;
|
|
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
|
import org.apache.poi.util.IOUtils;
|
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
|
import org.junit.Test;
|
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
|
|
|
|
public class TestXSLFPictureShape {
|
|
private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
|
|
|
|
@Test
|
|
public void testCreate() throws Exception {
|
|
XMLSlideShow ppt1 = new XMLSlideShow();
|
|
assertEquals(0, ppt1.getPictureData().size());
|
|
byte[] data1 = new byte[100];
|
|
for(int i = 0;i < 100;i++) { data1[i] = (byte)i; }
|
|
XSLFPictureData pdata1 = ppt1.addPicture(data1, PictureType.JPEG);
|
|
assertEquals(0, pdata1.getIndex());
|
|
assertEquals(1, ppt1.getPictureData().size());
|
|
|
|
XSLFSlide slide = ppt1.createSlide();
|
|
XSLFPictureShape shape1 = slide.createPicture(pdata1);
|
|
assertNotNull(shape1.getPictureData());
|
|
assertArrayEquals(data1, shape1.getPictureData().getData());
|
|
|
|
byte[] data2 = new byte[200];
|
|
for(int i = 0;i < 200;i++) { data2[i] = (byte)i; }
|
|
XSLFPictureData pdata2 = ppt1.addPicture(data2, PictureType.PNG);
|
|
XSLFPictureShape shape2 = slide.createPicture(pdata2);
|
|
assertNotNull(shape2.getPictureData());
|
|
assertEquals(1, pdata2.getIndex());
|
|
assertEquals(2, ppt1.getPictureData().size());
|
|
assertArrayEquals(data2, shape2.getPictureData().getData());
|
|
|
|
XMLSlideShow ppt2 = XSLFTestDataSamples.writeOutAndReadBack(ppt1);
|
|
ppt1.close();
|
|
List<XSLFPictureData> pics = ppt2.getPictureData();
|
|
assertEquals(2, pics.size());
|
|
assertArrayEquals(data1, pics.get(0).getData());
|
|
assertArrayEquals(data2, pics.get(1).getData());
|
|
|
|
List<XSLFShape> shapes = ppt2.getSlides().get(0).getShapes();
|
|
assertArrayEquals(data1, ((XSLFPictureShape) shapes.get(0)).getPictureData().getData());
|
|
assertArrayEquals(data2, ((XSLFPictureShape) shapes.get(1)).getPictureData().getData());
|
|
ppt2.close();
|
|
}
|
|
|
|
@Test
|
|
public void testCreateMultiplePictures() throws Exception {
|
|
XMLSlideShow ppt1 = new XMLSlideShow();
|
|
XSLFSlide slide1 = ppt1.createSlide();
|
|
XSLFGroupShape group1 = slide1.createGroup();
|
|
|
|
|
|
int pictureIndex = 0;
|
|
// first add 20 images to the slide
|
|
for (int i = 0; i < 20; i++, pictureIndex++) {
|
|
byte[] data = new byte[]{(byte)pictureIndex};
|
|
XSLFPictureData elementData = ppt1.addPicture(data, PictureType.PNG);
|
|
assertEquals(pictureIndex, elementData.getIndex()); // added images have indexes 0,1,2....19
|
|
XSLFPictureShape picture = slide1.createPicture(elementData);
|
|
// POI saves images as image1.png, image2.png, etc.
|
|
String fileName = "image" + (elementData.getIndex()+1) + ".png";
|
|
assertEquals(fileName, picture.getPictureData().getFileName());
|
|
assertArrayEquals(data, picture.getPictureData().getData());
|
|
}
|
|
|
|
// and then add next 20 images to a group
|
|
for (int i = 0; i < 20; i++, pictureIndex++) {
|
|
byte[] data = new byte[]{(byte)pictureIndex};
|
|
XSLFPictureData elementData = ppt1.addPicture(data, PictureType.PNG);
|
|
XSLFPictureShape picture = group1.createPicture(elementData);
|
|
// POI saves images as image1.png, image2.png, etc.
|
|
assertEquals(pictureIndex, elementData.getIndex()); // added images have indexes 0,1,2....19
|
|
String fileName = "image" + (pictureIndex + 1) + ".png";
|
|
assertEquals(fileName, picture.getPictureData().getFileName());
|
|
assertArrayEquals(data, picture.getPictureData().getData());
|
|
}
|
|
|
|
// serialize, read back and check that all images are there
|
|
|
|
XMLSlideShow ppt2 = XSLFTestDataSamples.writeOutAndReadBack(ppt1);
|
|
ppt1.close();
|
|
// pictures keyed by file name
|
|
Map<String, XSLFPictureData> pics = new HashMap<String, XSLFPictureData>();
|
|
for(XSLFPictureData p : ppt2.getPictureData()){
|
|
pics.put(p.getFileName(), p);
|
|
}
|
|
assertEquals(40, pics.size());
|
|
for (int i = 0; i < 40; i++) {
|
|
byte[] data1 = new byte[]{(byte)i};
|
|
String fileName = "image" + (i + 1) + ".png";
|
|
XSLFPictureData data = pics.get(fileName);
|
|
assertNotNull(data);
|
|
assertEquals(fileName, data.getFileName());
|
|
assertArrayEquals(data1, data.getData());
|
|
}
|
|
ppt2.close();
|
|
}
|
|
|
|
@Test
|
|
public void testImageCaching() throws Exception {
|
|
XMLSlideShow ppt = new XMLSlideShow();
|
|
byte[] img1 = new byte[]{1,2,3};
|
|
byte[] img2 = new byte[]{3,4,5};
|
|
XSLFPictureData pdata1 = ppt.addPicture(img1, PictureType.PNG);
|
|
assertEquals(0, pdata1.getIndex());
|
|
assertEquals(0, ppt.addPicture(img1, PictureType.PNG).getIndex());
|
|
|
|
XSLFPictureData idx2 = ppt.addPicture(img2, PictureType.PNG);
|
|
assertEquals(1, idx2.getIndex());
|
|
assertEquals(1, ppt.addPicture(img2, PictureType.PNG).getIndex());
|
|
|
|
XSLFSlide slide1 = ppt.createSlide();
|
|
assertNotNull(slide1);
|
|
XSLFSlide slide2 = ppt.createSlide();
|
|
assertNotNull(slide2);
|
|
|
|
ppt.close();
|
|
}
|
|
|
|
@Test
|
|
public void testMerge() throws Exception {
|
|
XMLSlideShow ppt1 = new XMLSlideShow();
|
|
byte[] data1 = new byte[100];
|
|
XSLFPictureData pdata1 = ppt1.addPicture(data1, PictureType.JPEG);
|
|
|
|
XSLFSlide slide1 = ppt1.createSlide();
|
|
XSLFPictureShape shape1 = slide1.createPicture(pdata1);
|
|
CTPicture ctPic1 = (CTPicture)shape1.getXmlObject();
|
|
ctPic1.getNvPicPr().getNvPr().addNewCustDataLst().addNewTags().setId("rId99");
|
|
|
|
XMLSlideShow ppt2 = new XMLSlideShow();
|
|
|
|
XSLFSlide slide2 = ppt2.createSlide().importContent(slide1);
|
|
XSLFPictureShape shape2 = (XSLFPictureShape)slide2.getShapes().get(0);
|
|
|
|
assertArrayEquals(data1, shape2.getPictureData().getData());
|
|
|
|
CTPicture ctPic2 = (CTPicture)shape2.getXmlObject();
|
|
assertFalse(ctPic2.getNvPicPr().getNvPr().isSetCustDataLst());
|
|
|
|
ppt1.close();
|
|
ppt2.close();
|
|
}
|
|
|
|
@Test
|
|
public void bug58663() throws IOException {
|
|
InputStream is = _slTests.openResourceAsStream("shapes.pptx");
|
|
XMLSlideShow ppt = new XMLSlideShow(is);
|
|
is.close();
|
|
|
|
XSLFSlide slide = ppt.getSlides().get(0);
|
|
XSLFPictureShape ps = (XSLFPictureShape)slide.getShapes().get(3);
|
|
slide.removeShape(ps);
|
|
|
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
|
ppt.write(bos);
|
|
ppt.close();
|
|
|
|
XMLSlideShow ppt2 = new XMLSlideShow(new ByteArrayInputStream(bos.toByteArray()));
|
|
assertTrue(ppt2.getPictureData().isEmpty());
|
|
ppt2.close();
|
|
}
|
|
|
|
@Test
|
|
public void testTiffImageBug59742() throws Exception {
|
|
XMLSlideShow slideShow = new XMLSlideShow();
|
|
final InputStream tiffStream = _slTests.openResourceAsStream("testtiff.tif");
|
|
final byte[] pictureData = IOUtils.toByteArray(tiffStream);
|
|
IOUtils.closeQuietly(tiffStream);
|
|
|
|
XSLFPictureData pic = slideShow.addPicture(pictureData, PictureType.TIFF);
|
|
assertEquals("image/tiff", pic.getContentType());
|
|
assertEquals("image1.tiff", pic.getFileName());
|
|
|
|
slideShow.close();
|
|
}
|
|
} |