]> source.dussan.org Git - poi.git/commitdiff
[bug-65718] Charts imported without blip fills
authorPJ Fanning <fanningpj@apache.org>
Thu, 2 Dec 2021 10:10:17 +0000 (10:10 +0000)
committerPJ Fanning <fanningpj@apache.org>
Thu, 2 Dec 2021 10:10:17 +0000 (10:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1895487 13f79535-47bb-0310-9956-ffa450edef68

poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSheet.java
test-data/slideshow/chart-picture-bg.pptx [new file with mode: 0644]
test-data/slideshow/chart-texture-bg.pptx [new file with mode: 0644]

index c0b05b921121d8e351a5dd75c5a4b03eecb07eb0..d8ab3df4d4e89b36ab846816522aba2ce6354f7f 100644 (file)
@@ -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();
+    }
 }
index d853d0bb2c0ca11a3bf2af61b3c9742fd7c8ca26..1e5b4355bbdeb772c43bed2e0b875d0e7555239e 100644 (file)
@@ -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);
             }
index d9879e3637406e621ecba5edc2c791edf106cc9c..6812e86c55c5bdc08833b5dc14c440d8a49594d4 100644 (file)
@@ -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);
     }
 
     /**
index 1d8e105decf6e6a699e775a705af9a29d48aa037..5b6bacf58cf2f31c8a0a95cc386eab1eef33ecac 100644 (file)
@@ -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
diff --git a/test-data/slideshow/chart-picture-bg.pptx b/test-data/slideshow/chart-picture-bg.pptx
new file mode 100644 (file)
index 0000000..663050f
Binary files /dev/null and b/test-data/slideshow/chart-picture-bg.pptx differ
diff --git a/test-data/slideshow/chart-texture-bg.pptx b/test-data/slideshow/chart-texture-bg.pptx
new file mode 100644 (file)
index 0000000..179dcf4
Binary files /dev/null and b/test-data/slideshow/chart-texture-bg.pptx differ