From 172db2ca584228dc8048446b8c1aa2a315c0a6db Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Sat, 25 Jul 2009 10:41:53 +0000 Subject: [PATCH] fixed XWPFWordExtractor to extract inserted/deleted text, see Bugzilla 45597 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@797740 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/xwpf/usermodel/XWPFParagraph.java | 24 ++++++++---------- .../xwpf/extractor/TestXWPFWordExtractor.java | 7 +++++ .../org/apache/poi/hwpf/data/delins.docx | Bin 0 -> 17720 bytes 4 files changed, 18 insertions(+), 14 deletions(-) create mode 100755 src/scratchpad/testcases/org/apache/poi/hwpf/data/delins.docx diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index e935ae62c6..91b9cdede0 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 47571 - Fixed XWPFWordExtractor to extract inserted/deleted text 47548 - Fixed RecordFactoryInputStream to properly read continued DrawingRecords 46419 - Fixed compatibility issue with OpenOffice 3.0 47559 - Fixed compatibility issue with Excel 2008 Mac sp2 diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java index 81a4add75e..2d0caf1b5f 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java @@ -18,6 +18,7 @@ package org.apache.poi.xwpf.usermodel; import java.math.BigInteger; import java.util.ArrayList; +import java.util.Arrays; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; @@ -56,23 +57,18 @@ public class XWPFParagraph { // TODO - replace this with some sort of XPath expression // to directly find all the CTRs, in the right order ArrayList rs = new ArrayList(); - CTR[] tmp; + rs.addAll(Arrays.asList(paragraph.getRArray())); - // Get the main text runs - tmp = paragraph.getRArray(); - for (int i = 0; i < tmp.length; i++) { - rs.add(tmp[i]); + for (CTSdtRun sdt : paragraph.getSdtArray()) { + CTSdtContentRun run = sdt.getSdtContent(); + rs.addAll(Arrays.asList(run.getRArray())); + } + for (CTRunTrackChange c : paragraph.getDelArray()) { + rs.addAll(Arrays.asList(c.getRArray())); } - // Not sure quite what these are, but they hold - // more text runs - CTSdtRun[] sdts = paragraph.getSdtArray(); - for (int i = 0; i < sdts.length; i++) { - CTSdtContentRun run = sdts[i].getSdtContent(); - tmp = run.getRArray(); - for (int j = 0; j < tmp.length; j++) { - rs.add(tmp[j]); - } + for (CTRunTrackChange c : paragraph.getInsArray()) { + rs.addAll(Arrays.asList(c.getRArray())); } // Get text of the paragraph 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 e923c40fcb..fe80baff10 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java @@ -192,6 +192,13 @@ public class TestXWPFWordExtractor extends TestCase { assertTrue(extractor.getText().contains("XXX")); } + public void testInsertedDeletedText() throws Exception { + XWPFDocument doc = open("delins.docx"); + XWPFWordExtractor extractor = new XWPFWordExtractor(doc); + + assertTrue(extractor.getText().contains("pendant worn")); + assertTrue(extractor.getText().contains("extremely well")); + } //TODO use the same logic for opening test files as in HSSFTestDataSamples private XWPFDocument open(String sampleFileName) throws IOException { diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/delins.docx b/src/scratchpad/testcases/org/apache/poi/hwpf/data/delins.docx new file mode 100755 index 0000000000000000000000000000000000000000..b53069135b573f226bc594a47ff368bdb8de8c6f GIT binary patch literal 17720 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