From da2afc19e240ba057ead3f925b087b7f3e5dbd17 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 28 Mar 2020 09:24:38 +0000 Subject: [PATCH] Bug 55966: Include content control text in word extraction also if it is part of a paragraph git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1875802 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xwpf/extractor/XWPFWordExtractor.java | 9 +++-- .../xwpf/extractor/TestXWPFWordExtractor.java | 37 +++++++++++++----- test-data/document/55966.docx | Bin 0 -> 20757 bytes 3 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 test-data/document/55966.docx diff --git a/src/ooxml/java/org/apache/poi/xwpf/extractor/XWPFWordExtractor.java b/src/ooxml/java/org/apache/poi/xwpf/extractor/XWPFWordExtractor.java index cacac24323..4b61c09d19 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/extractor/XWPFWordExtractor.java +++ b/src/ooxml/java/org/apache/poi/xwpf/extractor/XWPFWordExtractor.java @@ -90,7 +90,7 @@ public class XWPFWordExtractor extends POIXMLTextExtractor { /** * Should we concatenate phonetic runs in extraction. Default is true - * @param concatenatePhoneticRuns + * @param concatenatePhoneticRuns If phonetic runs should be concatenated */ public void setConcatenatePhoneticRuns(boolean concatenatePhoneticRuns) { this.concatenatePhoneticRuns = concatenatePhoneticRuns; @@ -138,9 +138,10 @@ public class XWPFWordExtractor extends POIXMLTextExtractor { extractHeaders(text, headerFooterPolicy); } - - for (IRunElement run : paragraph.getRuns()) { - if (! concatenatePhoneticRuns && run instanceof XWPFRun) { + for (IRunElement run : paragraph.getIRuns()) { + if (run instanceof XWPFSDT) { + text.append(((XWPFSDT) run).getContent().getText()); + } else if (! concatenatePhoneticRuns && run instanceof XWPFRun) { text.append(((XWPFRun)run).text()); } else { text.append(run); diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java b/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java index ecab432c10..8a14b25ba0 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java @@ -17,6 +17,16 @@ package org.apache.poi.xwpf.extractor; +import org.apache.poi.util.StringUtil; +import org.apache.poi.xwpf.XWPFTestDataSamples; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.junit.Test; + +import java.io.IOException; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import static org.apache.poi.POITestCase.assertContains; import static org.apache.poi.POITestCase.assertEndsWith; import static org.apache.poi.POITestCase.assertNotContained; @@ -25,16 +35,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import java.io.IOException; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.poi.util.StringUtil; -import org.apache.poi.xwpf.XWPFTestDataSamples; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.junit.Test; - /** * Tests for HXFWordExtractor */ @@ -460,4 +460,21 @@ public class TestXWPFWordExtractor { assertContains(txt, "footer 1"); } } + + @Test + public void bug55966() throws IOException { + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("55966.docx")) { + String expected = "Content control within a paragraph is here text content from within a paragraph second control with a new\n" + + "line\n" + + "\n" + + "Content control that is the entire paragraph\n"; + + XWPFWordExtractor extractedDoc = new XWPFWordExtractor(doc); + + String actual = extractedDoc.getText(); + + extractedDoc.close(); + assertEquals(expected, actual); + } + } } diff --git a/test-data/document/55966.docx b/test-data/document/55966.docx new file mode 100644 index 0000000000000000000000000000000000000000..28543c970284917cb08558041fcf13b9abf050cf GIT binary patch literal 20757 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