mirror of
https://github.com/apache/poi.git
synced 2026-02-27 20:40:08 +08:00
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1846931 13f79535-47bb-0310-9956-ffa450edef68
224 lines
10 KiB
Java
224 lines
10 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.sl;
|
|
|
|
import static org.apache.poi.sl.SLCommonUtils.xslfOnly;
|
|
import static org.apache.poi.sl.usermodel.ObjectMetaData.Application.EXCEL_V12;
|
|
import static org.apache.poi.sl.usermodel.ObjectMetaData.Application.EXCEL_V8;
|
|
import static org.apache.poi.sl.usermodel.ObjectMetaData.Application.PDF;
|
|
import static org.apache.poi.sl.usermodel.ObjectMetaData.Application.WORD_V12;
|
|
import static org.apache.poi.sl.usermodel.ObjectMetaData.Application.WORD_V8;
|
|
import static org.junit.Assert.assertArrayEquals;
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.fail;
|
|
import static org.junit.Assume.assumeFalse;
|
|
|
|
import java.awt.geom.Rectangle2D;
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.lang.reflect.Constructor;
|
|
import java.lang.reflect.Method;
|
|
import java.util.Arrays;
|
|
import java.util.Collection;
|
|
|
|
import org.apache.poi.POIDataSamples;
|
|
import org.apache.poi.POIDocument;
|
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
|
import org.apache.poi.poifs.storage.RawDataUtil;
|
|
import org.apache.poi.sl.usermodel.ObjectMetaData;
|
|
import org.apache.poi.sl.usermodel.ObjectShape;
|
|
import org.apache.poi.sl.usermodel.PictureData;
|
|
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
|
import org.apache.poi.sl.usermodel.Slide;
|
|
import org.apache.poi.sl.usermodel.SlideShow;
|
|
import org.apache.poi.sl.usermodel.SlideShowFactory;
|
|
import org.apache.poi.ss.usermodel.Workbook;
|
|
import org.apache.poi.ss.usermodel.WorkbookFactory;
|
|
import org.apache.poi.util.IOUtils;
|
|
import org.apache.poi.xslf.usermodel.XMLSlideShow;
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
|
import org.junit.BeforeClass;
|
|
import org.junit.Test;
|
|
import org.junit.runner.RunWith;
|
|
import org.junit.runners.Parameterized;
|
|
import org.junit.runners.Parameterized.Parameter;
|
|
import org.junit.runners.Parameterized.Parameters;
|
|
|
|
@RunWith(Parameterized.class)
|
|
public class TestOleShape {
|
|
private static final String PDF_SAMPLE =
|
|
"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";
|
|
|
|
enum Api { HSLF, XSLF };
|
|
|
|
|
|
@Parameter(value = 0)
|
|
public Api api;
|
|
@Parameter(value = 1)
|
|
public ObjectMetaData.Application app;
|
|
|
|
|
|
private static File pictureFile;
|
|
|
|
@BeforeClass
|
|
public static void initPicture() {
|
|
pictureFile = POIDataSamples.getSlideShowInstance().getFile("wrench.emf");
|
|
}
|
|
|
|
|
|
@Parameters(name="{0} {1}")
|
|
public static Collection<Object[]> data() {
|
|
return Arrays.asList(new Object[][] {
|
|
{ Api.HSLF, EXCEL_V8 },
|
|
{ Api.HSLF, WORD_V8 },
|
|
{ Api.HSLF, PDF },
|
|
{ Api.XSLF, EXCEL_V12 },
|
|
{ Api.XSLF, WORD_V12 },
|
|
{ Api.XSLF, PDF },
|
|
});
|
|
}
|
|
|
|
@Test
|
|
public void embedData() throws IOException, InvalidFormatException, ReflectiveOperationException {
|
|
final ByteArrayInputStream pptBytes;
|
|
try (SlideShow<?,?> ppt = createSlideShow()) {
|
|
final PictureData picData = ppt.addPicture(pictureFile, PictureType.EMF);
|
|
final Slide<?,?> slide = ppt.createSlide();
|
|
final ObjectShape<?,?> oleShape = slide.createOleShape(picData);
|
|
oleShape.setAnchor(new Rectangle2D.Double(100,100,100,100));
|
|
try (OutputStream os = oleShape.updateObjectData(app, null)) {
|
|
fillOleData(os);
|
|
}
|
|
final ByteArrayOutputStream bos = new ByteArrayOutputStream(50000);
|
|
ppt.write(bos);
|
|
pptBytes = new ByteArrayInputStream(bos.toByteArray());
|
|
}
|
|
try (SlideShow<?,?> ppt = SlideShowFactory.create(pptBytes)) {
|
|
final ObjectShape<?,?> oleShape = (ObjectShape<?,?>)ppt.getSlides().get(0).getShapes().get(0);
|
|
try (InputStream bis = oleShape.readObjectData()) {
|
|
validateOleData(bis);
|
|
}
|
|
}
|
|
}
|
|
|
|
private SlideShow<?,?> createSlideShow() throws ReflectiveOperationException {
|
|
if (api == Api.XSLF) {
|
|
return new XMLSlideShow();
|
|
} else {
|
|
assumeFalse(xslfOnly());
|
|
return (SlideShow<?,?>)Class.forName("org.apache.poi.hslf.usermodel.HSLFSlideShow").newInstance();
|
|
}
|
|
}
|
|
|
|
|
|
private void fillOleData(final OutputStream out) throws IOException {
|
|
switch (app) {
|
|
case EXCEL_V8:
|
|
case EXCEL_V12:
|
|
try (Workbook wb = (app == EXCEL_V12) ? new XSSFWorkbook() : new HSSFWorkbook()) {
|
|
wb.createSheet().createRow(0).createCell(0).setCellValue("test me");
|
|
wb.write(out);
|
|
}
|
|
break;
|
|
case WORD_V8:
|
|
try (InputStream is = POIDataSamples.getDocumentInstance().openResourceAsStream("simple.doc")) {
|
|
IOUtils.copy(is, out);
|
|
}
|
|
break;
|
|
case WORD_V12:
|
|
try (XWPFDocument doc = new XWPFDocument()) {
|
|
doc.createParagraph().createRun().setText("Test me");
|
|
doc.write(out);
|
|
}
|
|
break;
|
|
case PDF:
|
|
out.write(RawDataUtil.decompress(PDF_SAMPLE));
|
|
break;
|
|
default:
|
|
case CUSTOM:
|
|
fail("not implemented");
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void validateOleData(final InputStream in) throws IOException, InvalidFormatException, ReflectiveOperationException {
|
|
switch (app) {
|
|
case EXCEL_V8:
|
|
case EXCEL_V12:
|
|
try (Workbook wb = WorkbookFactory.create(in)) {
|
|
assertEquals("test me", wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
|
|
}
|
|
break;
|
|
case WORD_V8:
|
|
Class<? extends POIDocument> clazz = (Class<? extends POIDocument>)Class.forName("org.apache.poi.hwpf.HWPFDocument");
|
|
Constructor<? extends POIDocument> con = clazz.getDeclaredConstructor(InputStream.class);
|
|
Method m = clazz.getMethod("getDocumentText");
|
|
try (POIDocument doc = con.newInstance(in)) {
|
|
assertEquals("This is a simple file created with Word 97-SR2.\r", m.invoke(doc));
|
|
}
|
|
break;
|
|
case WORD_V12:
|
|
try (XWPFDocument doc = new XWPFDocument(in)) {
|
|
assertEquals("Test me", doc.getParagraphs().get(0).getText());
|
|
}
|
|
break;
|
|
case PDF:
|
|
final byte[] expected = RawDataUtil.decompress(PDF_SAMPLE);
|
|
final byte[] actual = IOUtils.toByteArray(in);
|
|
assertArrayEquals(expected, actual);
|
|
break;
|
|
default:
|
|
case CUSTOM:
|
|
fail("not implemented");
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|