From: PJ Fanning Date: Thu, 2 Dec 2021 10:10:17 +0000 (+0000) Subject: [bug-65718] Charts imported without blip fills X-Git-Tag: REL_5_2_0~143 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=f713f551ad31cae326300b00c068115072c91054;p=poi.git [bug-65718] Charts imported without blip fills git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1895487 13f79535-47bb-0310-9956-ffa450edef68 --- 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 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 { * @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 diff --git a/test-data/slideshow/chart-picture-bg.pptx b/test-data/slideshow/chart-picture-bg.pptx new file mode 100644 index 0000000000..663050fc33 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 index 0000000000..179dcf40bf Binary files /dev/null and b/test-data/slideshow/chart-texture-bg.pptx differ