mirror of https://github.com/apache/poi.git
Fix bug #56812 - In XSLF provide a way to get the URI of externally linked pictures
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1615812 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5a28c2bbb7
commit
d6b8ff12e5
|
@ -23,6 +23,7 @@ import java.awt.Graphics2D;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
@ -99,10 +100,27 @@ public class XSLFPictureShape extends XSLFSimpleShape {
|
||||||
setAnchor(new java.awt.Rectangle(50, 50, 200, 200));
|
setAnchor(new java.awt.Rectangle(50, 50, 200, 200));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is this an internal picture (image data included within
|
||||||
|
* the PowerPoint file), or an external linked picture
|
||||||
|
* (image lives outside)?
|
||||||
|
*/
|
||||||
|
public boolean isExternalLinkedPicture() {
|
||||||
|
if (getBlipId() == null && getBlipLink() != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the data on the (internal) picture.
|
||||||
|
* For an external linked picture, will return null
|
||||||
|
*/
|
||||||
public XSLFPictureData getPictureData() {
|
public XSLFPictureData getPictureData() {
|
||||||
if(_data == null){
|
if(_data == null){
|
||||||
String blipId = getBlipId();
|
String blipId = getBlipId();
|
||||||
|
if (blipId == null) return null;
|
||||||
|
|
||||||
PackagePart p = getSheet().getPackagePart();
|
PackagePart p = getSheet().getPackagePart();
|
||||||
PackageRelationship rel = p.getRelationship(blipId);
|
PackageRelationship rel = p.getRelationship(blipId);
|
||||||
|
@ -118,10 +136,45 @@ public class XSLFPictureShape extends XSLFSimpleShape {
|
||||||
}
|
}
|
||||||
return _data;
|
return _data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For an external linked picture, return the last-seen
|
||||||
|
* path to the picture.
|
||||||
|
* For an internal picture, returns null.
|
||||||
|
*/
|
||||||
|
public URI getPictureLink() {
|
||||||
|
if (getBlipId() != null) {
|
||||||
|
// Internal picture, nothing to return
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String rId = getBlipLink();
|
||||||
|
if (rId == null) {
|
||||||
|
// No link recorded, nothing we can do
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
PackagePart p = getSheet().getPackagePart();
|
||||||
|
PackageRelationship rel = p.getRelationship(rId);
|
||||||
|
if (rel != null) {
|
||||||
|
return rel.getTargetURI();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private String getBlipId(){
|
private CTBlip getBlip(){
|
||||||
CTPicture ct = (CTPicture)getXmlObject();
|
CTPicture ct = (CTPicture)getXmlObject();
|
||||||
return ct.getBlipFill().getBlip().getEmbed();
|
return ct.getBlipFill().getBlip();
|
||||||
|
}
|
||||||
|
private String getBlipLink(){
|
||||||
|
String link = getBlip().getLink();
|
||||||
|
if (link.isEmpty()) return null;
|
||||||
|
return link;
|
||||||
|
}
|
||||||
|
private String getBlipId(){
|
||||||
|
String id = getBlip().getEmbed();
|
||||||
|
if (id.isEmpty()) return null;
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -144,24 +144,34 @@ public class TestXSLFBugs extends POITestCase {
|
||||||
* there is no data available and XSLFPictureShape.getPictureData()
|
* there is no data available and XSLFPictureShape.getPictureData()
|
||||||
* gives a NPE, see bug #56812
|
* gives a NPE, see bug #56812
|
||||||
*/
|
*/
|
||||||
public void DISABLEDtest56812() throws Exception {
|
public void test56812() throws Exception {
|
||||||
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("56812.pptx");
|
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("56812.pptx");
|
||||||
|
|
||||||
int pictures = 0;
|
int internalPictures = 0;
|
||||||
|
int externalPictures = 0;
|
||||||
for (XSLFSlide slide : ppt.getSlides()){
|
for (XSLFSlide slide : ppt.getSlides()){
|
||||||
for (XSLFShape shape : slide.getShapes()){
|
for (XSLFShape shape : slide.getShapes()){
|
||||||
assertNotNull(shape);
|
assertNotNull(shape);
|
||||||
|
|
||||||
if (shape instanceof XSLFPictureShape) {
|
if (shape instanceof XSLFPictureShape) {
|
||||||
XSLFPictureData data = ((XSLFPictureShape) shape).getPictureData();
|
XSLFPictureShape picture = (XSLFPictureShape)shape;
|
||||||
assertNotNull(data);
|
if (picture.isExternalLinkedPicture()) {
|
||||||
assertNotNull(data.getFileName());
|
externalPictures++;
|
||||||
pictures++;
|
|
||||||
|
assertNotNull(picture.getPictureLink());
|
||||||
|
} else {
|
||||||
|
internalPictures++;
|
||||||
|
|
||||||
|
XSLFPictureData data = picture.getPictureData();
|
||||||
|
assertNotNull(data);
|
||||||
|
assertNotNull(data.getFileName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assertEquals(3, pictures);
|
assertEquals(2, internalPictures);
|
||||||
|
assertEquals(1, externalPictures);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getSlideText(XSLFSlide slide) {
|
protected String getSlideText(XSLFSlide slide) {
|
||||||
|
|
Loading…
Reference in New Issue