#58663 - Pictures cannot be removed from a slide
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1717018 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8c1517eee4
commit
0c7e8e0c47
@ -43,6 +43,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
|
|||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
|
||||||
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -173,6 +174,13 @@ implements XSLFShapeContainer, GroupShape<XSLFShape,XSLFTextParagraph> {
|
|||||||
grpSp.getGrpSpList().remove(obj);
|
grpSp.getGrpSpList().remove(obj);
|
||||||
} else if (obj instanceof CTConnector){
|
} else if (obj instanceof CTConnector){
|
||||||
grpSp.getCxnSpList().remove(obj);
|
grpSp.getCxnSpList().remove(obj);
|
||||||
|
} else if (obj instanceof CTPicture) {
|
||||||
|
XSLFPictureShape ps = (XSLFPictureShape)xShape;
|
||||||
|
XSLFSheet sh = getSheet();
|
||||||
|
if (sh != null) {
|
||||||
|
sh.removePictureRelation(ps);
|
||||||
|
}
|
||||||
|
grpSp.getPicList().remove(obj);
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Unsupported shape: " + xShape);
|
throw new IllegalArgumentException("Unsupported shape: " + xShape);
|
||||||
}
|
}
|
||||||
|
@ -144,16 +144,18 @@ public class XSLFPictureShape extends XSLFSimpleShape
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CTBlip getBlip(){
|
protected CTBlip getBlip(){
|
||||||
CTPicture ct = (CTPicture)getXmlObject();
|
CTPicture ct = (CTPicture)getXmlObject();
|
||||||
return ct.getBlipFill().getBlip();
|
return ct.getBlipFill().getBlip();
|
||||||
}
|
}
|
||||||
private String getBlipLink(){
|
|
||||||
|
protected String getBlipLink(){
|
||||||
String link = getBlip().getLink();
|
String link = getBlip().getLink();
|
||||||
if (link.isEmpty()) return null;
|
if (link.isEmpty()) return null;
|
||||||
return link;
|
return link;
|
||||||
}
|
}
|
||||||
private String getBlipId(){
|
|
||||||
|
protected String getBlipId(){
|
||||||
String id = getBlip().getEmbed();
|
String id = getBlip().getEmbed();
|
||||||
if (id.isEmpty()) return null;
|
if (id.isEmpty()) return null;
|
||||||
return id;
|
return id;
|
||||||
|
@ -49,7 +49,6 @@ import org.apache.poi.util.IOUtils;
|
|||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
||||||
@ -283,6 +282,10 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
spTree.getGrpSpList().remove(obj);
|
spTree.getGrpSpList().remove(obj);
|
||||||
} else if (obj instanceof CTConnector){
|
} else if (obj instanceof CTConnector){
|
||||||
spTree.getCxnSpList().remove(obj);
|
spTree.getCxnSpList().remove(obj);
|
||||||
|
} else if (obj instanceof CTPicture) {
|
||||||
|
XSLFPictureShape ps = (XSLFPictureShape)xShape;
|
||||||
|
removePictureRelation(ps);
|
||||||
|
spTree.getPicList().remove(obj);
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Unsupported shape: " + xShape);
|
throw new IllegalArgumentException("Unsupported shape: " + xShape);
|
||||||
}
|
}
|
||||||
@ -586,4 +589,14 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
|
|||||||
}
|
}
|
||||||
return part;
|
return part;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method for sheet and group shapes
|
||||||
|
*
|
||||||
|
* @param pictureShape the picture shapes whose relation is to be removed
|
||||||
|
*/
|
||||||
|
void removePictureRelation(XSLFPictureShape pictureShape) {
|
||||||
|
POIXMLDocumentPart pd = getRelationById(pictureShape.getBlipId());
|
||||||
|
removeRelation(pd);
|
||||||
|
}
|
||||||
}
|
}
|
@ -20,20 +20,24 @@ import static org.junit.Assert.assertArrayEquals;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
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.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
import org.apache.poi.POIDataSamples;
|
||||||
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
||||||
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public class TestXSLFPictureShape {
|
public class TestXSLFPictureShape {
|
||||||
|
private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreate() throws Exception {
|
public void testCreate() throws Exception {
|
||||||
@ -170,4 +174,23 @@ public class TestXSLFPictureShape {
|
|||||||
ppt1.close();
|
ppt1.close();
|
||||||
ppt2.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();
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user