Browse Source

[bug-65473] when copy slide, new slide uses old textrun object reference. Thanks to FlyingPigQAQ. This closes #371

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1903558 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_3
PJ Fanning 1 year ago
parent
commit
f1692cc041

+ 3
- 12
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java View File

thisP.removeFld(i-1); thisP.removeFld(i-1);
} }


try (XmlCursor thisC = thisP.newCursor()) {
thisC.toEndToken();
try (XmlCursor otherC = otherP.newCursor()) {
otherC.copyXmlContents(thisC);
}
}

for (XSLFTextRun tr : other.getTextRuns()) { 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); run.copy(tr);
_runs.add(run);
} }


// set properties again, in case we are based on a different // set properties again, in case we are based on a different

+ 17
- 6
poi-ooxml/src/test/java/org/apache/poi/xslf/TestXSLFSlideShow.java View File

import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.sl.usermodel.ShapeType; 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.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;


ppt2.close(); 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);
}
}
} }

BIN
test-data/slideshow/templatePPTWithOnlyOneText.pptx View File


Loading…
Cancel
Save