diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java index fc0bd3981f7..998a9582f49 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java @@ -53,6 +53,17 @@ public XWPFSDTContent(CTSdtContentRun sdtRun, IBody part, IRunBody parent) { } else if (o instanceof CTSdtRun) { XWPFSDT c = new XWPFSDT(((CTSdtRun) o), part); bodyElements.add(c); + } else if (o instanceof CTTrackChange) { + try (final XmlCursor trackChangeCursor = o.newCursor()) { + trackChangeCursor.selectPath("child::*"); + while (trackChangeCursor.toNextSelection()) { + XmlObject trackChangeChild = trackChangeCursor.getObject(); + if (trackChangeChild instanceof CTR){ + XWPFRun run = new XWPFRun((CTR) trackChangeChild, parent); + bodyElements.add(run); + } + } + } } } } @@ -123,8 +134,12 @@ public String getText() { text.append(((XWPFSDT) o).getContent().getText()); addNewLine = true; } else if (o instanceof XWPFRun) { - text.append(o); - addNewLine = false; + XWPFRun xRun = (XWPFRun) o; + // don't include the text if reviewing is enabled and this is a deleted run + if (xRun.getCTR().getDelTextArray().length == 0) { + text.append(o); + addNewLine = false; + } } if (addNewLine && i < bodyElements.size() - 1) { text.append("\n"); diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java index 235c17d3ab0..13f494dd5f5 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java @@ -176,6 +176,18 @@ void test62859() throws IOException { } } + @Test + void testTrackChangeInSDT() throws IOException { + try (XWPFDocument doc =XWPFTestDataSamples.openSampleDocument("trackChangeInSDT.docx")) { + List bodyElements = doc.getBodyElements(); + IBodyElement bodyElement = bodyElements.get(0); + if (bodyElement instanceof XWPFParagraph) { + XWPFParagraph p = (XWPFParagraph) bodyElement; + assertEquals("not in track change insert in track change ", p.getText()); + } + } + } + private List extractAllSDTs(XWPFDocument doc) { List sdts = new ArrayList<>(); diff --git a/test-data/document/trackChangeInSDT.docx b/test-data/document/trackChangeInSDT.docx new file mode 100644 index 00000000000..3487cfdcc96 Binary files /dev/null and b/test-data/document/trackChangeInSDT.docx differ