]> source.dussan.org Git - poi.git/commitdiff
[bug-65473] when copy slide, new slide uses old textrun object reference. Thanks...
authorPJ Fanning <fanningpj@apache.org>
Fri, 19 Aug 2022 08:40:32 +0000 (08:40 +0000)
committerPJ Fanning <fanningpj@apache.org>
Fri, 19 Aug 2022 08:40:32 +0000 (08:40 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1903558 13f79535-47bb-0310-9956-ffa450edef68

poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
poi-ooxml/src/test/java/org/apache/poi/xslf/TestXSLFSlideShow.java
test-data/slideshow/templatePPTWithOnlyOneText.pptx [new file with mode: 0644]

index c43e0e973a2468683ff9e3fe648ba2358acb002e..0eaf4ea775a03c64f675dedb7783c4751bbedb9f 100644 (file)
@@ -799,20 +799,11 @@ public class XSLFTextParagraph implements TextParagraph<XSLFShape,XSLFTextParagr
             thisP.removeFld(i-1);
         }
 
-        try (XmlCursor thisC = thisP.newCursor()) {
-            thisC.toEndToken();
-            try (XmlCursor otherC = otherP.newCursor()) {
-                otherC.copyXmlContents(thisC);
-            }
-        }
-
         for (XSLFTextRun tr : other.getTextRuns()) {
-            XmlObject xo = tr.getXmlObject();
-            XSLFTextRun run = (xo instanceof CTTextLineBreak)
-                ? newTextRun((CTTextLineBreak)xo)
-                : newTextRun(xo);
+            XmlObject xo = tr.getXmlObject().copy();
+            XSLFTextRun run = addNewTextRun();
+            run.getXmlObject().set(xo);
             run.copy(tr);
-            _runs.add(run);
         }
 
         // set properties again, in case we are based on a different
index c606c4a95a8ef97a68e3eff50b11b4fe2e9be57e..e66a2bec8dd9b2de0d3d828b337f6c7bc9d78b76 100644 (file)
@@ -26,13 +26,9 @@ import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.sl.usermodel.ShapeType;
-import org.apache.poi.xslf.usermodel.XMLSlideShow;
-import org.apache.poi.xslf.usermodel.XSLFAutoShape;
-import org.apache.poi.xslf.usermodel.XSLFBackground;
-import org.apache.poi.xslf.usermodel.XSLFRelation;
-import org.apache.poi.xslf.usermodel.XSLFSlide;
-import org.apache.poi.xslf.usermodel.XSLFSlideShow;
+import org.apache.poi.xslf.usermodel.*;
 import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlObject;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -156,4 +152,19 @@ class TestXSLFSlideShow {
 
         ppt2.close();
     }
+
+    @Test
+    void testSlideImportContent() throws IOException{
+        try (XMLSlideShow ppt = new XMLSlideShow(slTests.openResourceAsStream("templatePPTWithOnlyOneText.pptx"))) {
+            XSLFSlide templateSlide = ppt.getSlides().get(0);
+            XSLFTextShape templateTextShape = (XSLFTextShape) templateSlide.getShapes().get(0);
+            XmlObject templateTextRunXmlObject = templateTextShape.getTextParagraphs().get(0).getTextRuns().get(0).getXmlObject();
+
+            XSLFSlide copySlide = ppt.createSlide();
+            copySlide.importContent(templateSlide);
+            XSLFTextShape copyTextShape = (XSLFTextShape) copySlide.getShapes().get(0);
+            XmlObject copyTextRunXmlObject = copyTextShape.getTextParagraphs().get(0).getTextRuns().get(0).getXmlObject();
+            assertNotEquals(templateTextRunXmlObject, copyTextRunXmlObject);
+        }
+    }
 }
diff --git a/test-data/slideshow/templatePPTWithOnlyOneText.pptx b/test-data/slideshow/templatePPTWithOnlyOneText.pptx
new file mode 100644 (file)
index 0000000..7a0e1e7
Binary files /dev/null and b/test-data/slideshow/templatePPTWithOnlyOneText.pptx differ