mirror of
https://github.com/apache/poi.git
synced 2026-02-27 20:40:08 +08:00
JUnit5 test classes and methods should have default package visibility git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1885308 13f79535-47bb-0310-9956-ffa450edef68
286 lines
13 KiB
Java
286 lines
13 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.hssf.usermodel;
|
|
|
|
import static org.apache.poi.hssf.HSSFTestDataSamples.openSampleWorkbook;
|
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
|
import java.io.IOException;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
|
|
import org.apache.poi.POIDataSamples;
|
|
import org.apache.poi.ddf.EscherBSERecord;
|
|
import org.apache.poi.hssf.HSSFITestDataProvider;
|
|
import org.apache.poi.hssf.HSSFTestDataSamples;
|
|
import org.apache.poi.hssf.model.InternalSheet;
|
|
import org.apache.poi.ss.usermodel.BaseTestPicture;
|
|
import org.apache.poi.ss.usermodel.ClientAnchor;
|
|
import org.apache.poi.ss.usermodel.CreationHelper;
|
|
import org.apache.poi.ss.usermodel.Drawing;
|
|
import org.apache.poi.ss.usermodel.Picture;
|
|
import org.apache.poi.ss.usermodel.PictureData;
|
|
import org.apache.poi.ss.usermodel.Workbook;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
public final class TestHSSFPicture extends BaseTestPicture {
|
|
|
|
public TestHSSFPicture() {
|
|
super(HSSFITestDataProvider.instance);
|
|
}
|
|
|
|
protected Picture getPictureShape(Drawing<?> pat, int picIdx) {
|
|
return (Picture)((HSSFPatriarch)pat).getChildren().get(picIdx);
|
|
}
|
|
|
|
/**
|
|
* Bug # 45829 reported ArithmeticException (/ by zero) when resizing png with zero DPI.
|
|
*/
|
|
@Test
|
|
void bug45829() throws IOException {
|
|
try (HSSFWorkbook wb = new HSSFWorkbook()) {
|
|
HSSFSheet sh1 = wb.createSheet();
|
|
HSSFPatriarch p1 = sh1.createDrawingPatriarch();
|
|
|
|
byte[] pictureData = HSSFTestDataSamples.getTestDataFileContent("45829.png");
|
|
int idx1 = wb.addPicture(pictureData, HSSFWorkbook.PICTURE_TYPE_PNG);
|
|
HSSFPicture pic = p1.createPicture(new HSSFClientAnchor(), idx1);
|
|
pic.resize();
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
void addPictures() throws IOException {
|
|
try (HSSFWorkbook wb1 = new HSSFWorkbook()) {
|
|
|
|
HSSFSheet sh = wb1.createSheet("Pictures");
|
|
HSSFPatriarch dr = sh.createDrawingPatriarch();
|
|
assertEquals(0, dr.getChildren().size());
|
|
HSSFClientAnchor anchor = wb1.getCreationHelper().createClientAnchor();
|
|
|
|
//register a picture
|
|
byte[] data1 = {1, 2, 3};
|
|
int idx1 = wb1.addPicture(data1, Workbook.PICTURE_TYPE_JPEG);
|
|
assertEquals(1, idx1);
|
|
HSSFPicture p1 = dr.createPicture(anchor, idx1);
|
|
assertArrayEquals(data1, p1.getPictureData().getData());
|
|
|
|
// register another one
|
|
byte[] data2 = {4, 5, 6};
|
|
int idx2 = wb1.addPicture(data2, Workbook.PICTURE_TYPE_JPEG);
|
|
assertEquals(2, idx2);
|
|
HSSFPicture p2 = dr.createPicture(anchor, idx2);
|
|
assertEquals(2, dr.getChildren().size());
|
|
assertArrayEquals(data2, p2.getPictureData().getData());
|
|
|
|
// confirm that HSSFPatriarch.getChildren() returns two picture shapes
|
|
assertArrayEquals(data1, ((HSSFPicture) dr.getChildren().get(0)).getPictureData().getData());
|
|
assertArrayEquals(data2, ((HSSFPicture) dr.getChildren().get(1)).getPictureData().getData());
|
|
|
|
// write, read back and verify that our pictures are there
|
|
try (HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1)) {
|
|
List<? extends PictureData> lst2 = wb2.getAllPictures();
|
|
assertEquals(2, lst2.size());
|
|
assertArrayEquals(data1, lst2.get(0).getData());
|
|
assertArrayEquals(data2, lst2.get(1).getData());
|
|
|
|
// confirm that the pictures are in the Sheet's drawing
|
|
sh = wb2.getSheet("Pictures");
|
|
dr = sh.createDrawingPatriarch();
|
|
assertEquals(2, dr.getChildren().size());
|
|
assertArrayEquals(data1, ((HSSFPicture) dr.getChildren().get(0)).getPictureData().getData());
|
|
assertArrayEquals(data2, ((HSSFPicture) dr.getChildren().get(1)).getPictureData().getData());
|
|
|
|
// add a third picture
|
|
byte[] data3 = {7, 8, 9};
|
|
// picture index must increment across write-read
|
|
int idx3 = wb2.addPicture(data3, Workbook.PICTURE_TYPE_JPEG);
|
|
assertEquals(3, idx3);
|
|
HSSFPicture p3 = dr.createPicture(anchor, idx3);
|
|
assertArrayEquals(data3, p3.getPictureData().getData());
|
|
assertEquals(3, dr.getChildren().size());
|
|
assertArrayEquals(data1, ((HSSFPicture) dr.getChildren().get(0)).getPictureData().getData());
|
|
assertArrayEquals(data2, ((HSSFPicture) dr.getChildren().get(1)).getPictureData().getData());
|
|
assertArrayEquals(data3, ((HSSFPicture) dr.getChildren().get(2)).getPictureData().getData());
|
|
|
|
// write and read again
|
|
try (HSSFWorkbook wb3 = HSSFTestDataSamples.writeOutAndReadBack(wb2)) {
|
|
List<? extends PictureData> lst3 = wb3.getAllPictures();
|
|
// all three should be there
|
|
assertEquals(3, lst3.size());
|
|
assertArrayEquals(data1, lst3.get(0).getData());
|
|
assertArrayEquals(data2, lst3.get(1).getData());
|
|
assertArrayEquals(data3, lst3.get(2).getData());
|
|
|
|
sh = wb3.getSheet("Pictures");
|
|
dr = sh.createDrawingPatriarch();
|
|
assertEquals(3, dr.getChildren().size());
|
|
|
|
// forth picture
|
|
byte[] data4 = {10, 11, 12};
|
|
int idx4 = wb3.addPicture(data4, Workbook.PICTURE_TYPE_JPEG);
|
|
assertEquals(4, idx4);
|
|
dr.createPicture(anchor, idx4);
|
|
assertEquals(4, dr.getChildren().size());
|
|
assertArrayEquals(data1, ((HSSFPicture) dr.getChildren().get(0)).getPictureData().getData());
|
|
assertArrayEquals(data2, ((HSSFPicture) dr.getChildren().get(1)).getPictureData().getData());
|
|
assertArrayEquals(data3, ((HSSFPicture) dr.getChildren().get(2)).getPictureData().getData());
|
|
assertArrayEquals(data4, ((HSSFPicture) dr.getChildren().get(3)).getPictureData().getData());
|
|
|
|
try (HSSFWorkbook wb4 = HSSFTestDataSamples.writeOutAndReadBack(wb3)) {
|
|
List<? extends PictureData> lst4 = wb4.getAllPictures();
|
|
assertEquals(4, lst4.size());
|
|
assertArrayEquals(data1, lst4.get(0).getData());
|
|
assertArrayEquals(data2, lst4.get(1).getData());
|
|
assertArrayEquals(data3, lst4.get(2).getData());
|
|
assertArrayEquals(data4, lst4.get(3).getData());
|
|
sh = wb4.getSheet("Pictures");
|
|
dr = sh.createDrawingPatriarch();
|
|
assertEquals(4, dr.getChildren().size());
|
|
assertArrayEquals(data1, ((HSSFPicture) dr.getChildren().get(0)).getPictureData().getData());
|
|
assertArrayEquals(data2, ((HSSFPicture) dr.getChildren().get(1)).getPictureData().getData());
|
|
assertArrayEquals(data3, ((HSSFPicture) dr.getChildren().get(2)).getPictureData().getData());
|
|
assertArrayEquals(data4, ((HSSFPicture) dr.getChildren().get(3)).getPictureData().getData());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("unused")
|
|
@Test
|
|
void bsePictureRef() throws IOException {
|
|
try (HSSFWorkbook wb = new HSSFWorkbook()) {
|
|
HSSFSheet sh = wb.createSheet("Pictures");
|
|
HSSFPatriarch dr = sh.createDrawingPatriarch();
|
|
HSSFClientAnchor anchor = new HSSFClientAnchor();
|
|
|
|
InternalSheet ish = HSSFTestHelper.getSheetForTest(sh);
|
|
|
|
//register a picture
|
|
byte[] data1 = {1, 2, 3};
|
|
int idx1 = wb.addPicture(data1, Workbook.PICTURE_TYPE_JPEG);
|
|
assertEquals(1, idx1);
|
|
HSSFPicture p1 = dr.createPicture(anchor, idx1);
|
|
|
|
EscherBSERecord bse = wb.getWorkbook().getBSERecord(idx1);
|
|
|
|
assertEquals(bse.getRef(), 1);
|
|
dr.createPicture(new HSSFClientAnchor(), idx1);
|
|
assertEquals(bse.getRef(), 2);
|
|
|
|
HSSFShapeGroup gr = dr.createGroup(new HSSFClientAnchor());
|
|
gr.createPicture(new HSSFChildAnchor(), idx1);
|
|
assertEquals(bse.getRef(), 3);
|
|
}
|
|
}
|
|
|
|
@Test
|
|
void readExistingImage() throws IOException {
|
|
try (HSSFWorkbook wb = openSampleWorkbook("drawings.xls")) {
|
|
HSSFSheet sheet = wb.getSheet("picture");
|
|
HSSFPatriarch drawing = sheet.getDrawingPatriarch();
|
|
assertEquals(1, drawing.getChildren().size());
|
|
|
|
HSSFPicture picture = (HSSFPicture) drawing.getChildren().get(0);
|
|
assertEquals(picture.getFileName(), "test");
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("resource")
|
|
@Test
|
|
void setGetProperties() throws IOException {
|
|
try (HSSFWorkbook wb1 = new HSSFWorkbook()) {
|
|
|
|
HSSFSheet sh = wb1.createSheet("Pictures");
|
|
HSSFPatriarch dr = sh.createDrawingPatriarch();
|
|
HSSFClientAnchor anchor = new HSSFClientAnchor();
|
|
|
|
//register a picture
|
|
byte[] data1 = {1, 2, 3};
|
|
int idx1 = wb1.addPicture(data1, Workbook.PICTURE_TYPE_JPEG);
|
|
HSSFPicture p1 = dr.createPicture(anchor, idx1);
|
|
|
|
assertEquals(p1.getFileName(), "");
|
|
p1.setFileName("aaa");
|
|
assertEquals(p1.getFileName(), "aaa");
|
|
|
|
try (HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1)) {
|
|
sh = wb2.getSheet("Pictures");
|
|
dr = sh.getDrawingPatriarch();
|
|
|
|
p1 = (HSSFPicture) dr.getChildren().get(0);
|
|
assertEquals(p1.getFileName(), "aaa");
|
|
}
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("resource")
|
|
@Test
|
|
void bug49658() throws IOException {
|
|
// test if inserted EscherMetafileBlip will be read again
|
|
try (HSSFWorkbook wb1 = new HSSFWorkbook()) {
|
|
|
|
byte[] pictureDataEmf = POIDataSamples.getDocumentInstance().readFile("vector_image.emf");
|
|
int indexEmf = wb1.addPicture(pictureDataEmf, HSSFWorkbook.PICTURE_TYPE_EMF);
|
|
byte[] pictureDataPng = POIDataSamples.getSpreadSheetInstance().readFile("logoKarmokar4.png");
|
|
int indexPng = wb1.addPicture(pictureDataPng, HSSFWorkbook.PICTURE_TYPE_PNG);
|
|
byte[] pictureDataWmf = POIDataSamples.getSlideShowInstance().readFile("santa.wmf");
|
|
int indexWmf = wb1.addPicture(pictureDataWmf, HSSFWorkbook.PICTURE_TYPE_WMF);
|
|
|
|
HSSFSheet sheet = wb1.createSheet();
|
|
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
|
|
CreationHelper ch = wb1.getCreationHelper();
|
|
|
|
ClientAnchor anchor = ch.createClientAnchor();
|
|
anchor.setCol1(2);
|
|
anchor.setCol2(5);
|
|
anchor.setRow1(1);
|
|
anchor.setRow2(6);
|
|
patriarch.createPicture(anchor, indexEmf);
|
|
|
|
anchor = ch.createClientAnchor();
|
|
anchor.setCol1(2);
|
|
anchor.setCol2(5);
|
|
anchor.setRow1(10);
|
|
anchor.setRow2(16);
|
|
patriarch.createPicture(anchor, indexPng);
|
|
|
|
anchor = ch.createClientAnchor();
|
|
anchor.setCol1(6);
|
|
anchor.setCol2(9);
|
|
anchor.setRow1(1);
|
|
anchor.setRow2(6);
|
|
patriarch.createPicture(anchor, indexWmf);
|
|
|
|
|
|
try (HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1)) {
|
|
byte[] pictureDataOut = wb2.getAllPictures().get(0).getData();
|
|
assertArrayEquals(pictureDataEmf, pictureDataOut);
|
|
|
|
byte[] wmfNoHeader = Arrays.copyOfRange(pictureDataWmf, 22, pictureDataWmf.length);
|
|
pictureDataOut = wb2.getAllPictures().get(2).getData();
|
|
assertArrayEquals(wmfNoHeader, pictureDataOut);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|