summaryrefslogtreecommitdiffstats
path: root/poi-ooxml
diff options
context:
space:
mode:
authorPJ Fanning <fanningpj@apache.org>2021-12-02 10:10:17 +0000
committerPJ Fanning <fanningpj@apache.org>2021-12-02 10:10:17 +0000
commitf713f551ad31cae326300b00c068115072c91054 (patch)
tree868bfe6dcaa68294d991b541316bc95e6aa88636 /poi-ooxml
parent7963866c6f07058bfb1e59caf6ef6c6934db488d (diff)
downloadpoi-f713f551ad31cae326300b00c068115072c91054.tar.gz
poi-f713f551ad31cae326300b00c068115072c91054.zip
[bug-65718] Charts imported without blip fills
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1895487 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poi-ooxml')
-rw-r--r--poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java32
-rw-r--r--poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java14
-rw-r--r--poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSheet.java19
-rw-r--r--poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSheet.java26
4 files changed, 73 insertions, 18 deletions
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
index c0b05b9211..d8ab3df4d4 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
@@ -633,4 +633,36 @@ public class XMLSlideShow extends POIXMLDocument
public List<XSLFFontInfo> getFonts() {
return XSLFFontInfo.getFonts(this);
}
+
+ /**
+ * Import a picture data from a document part.
+ *
+ * @param blipId the ID of the package relationship to retrieve
+ * @param parent the parent document part containing the data to import
+ * @param target the target document part to import the data to
+ * @return the ID of the created relationship
+ */
+ String importBlip(String blipId, POIXMLDocumentPart parent, POIXMLDocumentPart target) {
+ OPCPackage targetPackage = target.getPackagePart().getPackage();
+ if (targetPackage != getPackage()) {
+ throw new RuntimeException("the target document part is not a child of this package");
+ }
+ final POIXMLDocumentPart docPart = parent.getRelationPartById(blipId).getDocumentPart();
+ XSLFPictureData parData;
+ if (docPart instanceof XSLFPictureData) {
+ parData = (XSLFPictureData)docPart;
+ } else {
+ throw new RuntimeException("cannot import blip " + blipId + " - its document part is not XSLFPictureData");
+ }
+ final XSLFPictureData pictureData;
+ if (targetPackage == parent.getPackagePart().getPackage()) {
+ // handle ref counter correct, if the parent document is the same as this
+ pictureData = parData;
+ } else {
+ pictureData = addPicture(parData.getData(), parData.getType());
+ }
+
+ RelationPart rp = target.addRelation(null, XSLFRelation.IMAGES, pictureData);
+ return rp.getRelationship().getId();
+ }
}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
index d853d0bb2c..1e5b4355bb 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
@@ -40,11 +40,13 @@ import org.apache.poi.util.Units;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
@@ -235,6 +237,18 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh
chartCopy.importContent(srcChart);
chartCopy.setWorkbook(srcChart.getWorkbook());
c.setAttributeText(idQualifiedName, slide.getRelationId(chartCopy));
+
+ // duplicate the blip fill if set
+ CTChartSpace chartSpaceCopy = chartCopy.getCTChartSpace();
+ if (chartSpaceCopy != null) {
+ XSLFPropertiesDelegate.XSLFFillProperties fp = XSLFPropertiesDelegate.getFillDelegate(chartSpaceCopy.getSpPr());
+ if (fp != null && fp.isSetBlipFill()) {
+ CTBlip blip = fp.getBlipFill().getBlip();
+ String blipId = blip.getEmbed();
+ String relId = slide.getSlideShow().importBlip(blipId, srcChart, chartCopy);
+ blip.setEmbed(relId);
+ }
+ }
} catch (InvalidFormatException | IOException e) {
throw new POIXMLException(e);
}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
index d9879e3637..6812e86c55 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
@@ -648,24 +648,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
* @return ID of the created relationship
*/
String importBlip(String blipId, POIXMLDocumentPart parent) {
- final POIXMLDocumentPart docPart = parent.getRelationPartById(blipId).getDocumentPart();
- XSLFPictureData parData;
- if (docPart instanceof XSLFPictureData) {
- parData = (XSLFPictureData)docPart;
- } else {
- throw new RuntimeException("cannot import blip " + blipId + " - document part is not XSLFPictureData type");
- }
- final XSLFPictureData pictureData;
- if (getPackagePart().getPackage() == parent.getPackagePart().getPackage()) {
- // handle ref counter correct, if the parent document is the same as this
- pictureData = parData;
- } else {
- XMLSlideShow ppt = getSlideShow();
- pictureData = ppt.addPicture(parData.getData(), parData.getType());
- }
-
- RelationPart rp = addRelation(null, XSLFRelation.IMAGES, pictureData);
- return rp.getRelationship().getId();
+ return getSlideShow().importBlip(blipId, parent, this);
}
/**
diff --git a/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSheet.java b/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSheet.java
index 1d8e105dec..5b6bacf58c 100644
--- a/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSheet.java
+++ b/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSheet.java
@@ -89,6 +89,32 @@ class TestXSLFSheet {
assertNotNull(((XSLFGraphicFrame) shape1).getChart(), "chart found in slide1?");
}
}
+
+ // test importing charts with blip fills
+ try (
+ XMLSlideShow textureSlideShow = openSampleDocument("chart-texture-bg.pptx");
+ XMLSlideShow pictureSlideShow = openSampleDocument("chart-picture-bg.pptx");
+ ) {
+ XMLSlideShow[] sourceSlideShows = new XMLSlideShow[] { textureSlideShow, pictureSlideShow };
+ XMLSlideShow targetSlideShow = textureSlideShow;
+ for (XMLSlideShow sourceSlideShow : sourceSlideShows) {
+ Boolean sameSlideShow = sourceSlideShow == targetSlideShow;
+ String assertMessage = "importing charts " + (sameSlideShow ? "within the same slide show" : "from another slideshow") + ": ";
+ XSLFSlide sourceSlide = sourceSlideShow.getSlides().get(0);
+ XSLFSlide slide = targetSlideShow.createSlide();
+ slide.importContent(sourceSlide);
+
+ XSLFShape shape = slide.getShapes().get(0);
+ assertNotNull(shape, assertMessage + "the shape is not copied");
+ assertInstanceOf(XSLFGraphicFrame.class, shape, assertMessage + "the shape is not XSLFGraphicFrame");
+
+ XSLFChart chart = ((XSLFGraphicFrame) shape).getChart();
+ assertNotNull(chart, assertMessage + "the shape doesn't have the chart");
+
+ String blipId1 = chart.getCTChartSpace().getSpPr().getBlipFill().getBlip().getEmbed();
+ assertNotNull(slide.getRelationById(blipId1), assertMessage + "the shape chart doesn't have the blip fill");
+ }
+ }
}
} \ No newline at end of file