From 216ecd14077cf0b290a2addfa355f7c1cc2b4bc9 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 25 May 2010 20:31:42 +0000 Subject: [PATCH] Fix bug #49189 - Detect w:tab and w:cr entries in XWPF paragraphs, even when the XSD is silly and maps them to CTEmpty git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@948199 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/xwpf/usermodel/XWPFParagraph.java | 13 +++++++++++++ .../xwpf/extractor/TestXWPFWordExtractor.java | 18 ++++++++++++++++++ test-data/document/WithTabs.docx | Bin 0 -> 14190 bytes 4 files changed, 32 insertions(+) create mode 100644 test-data/document/WithTabs.docx diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 826937bee5..be43882899 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 49189 - Detect w:tab and w:cr entries in XWPF paragraphs, even when the XSD is silly and maps them to CTEmpty 49273 - Correct handling for Font Character Sets with indicies greater than 127 49334 - Track the ValueRangeRecords of charts in HSSFChart, to allow the basic axis operations 49242 - Track the LinkDataRecords of charts in HSSFChart 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 3bdf4c365e..b09cc1edd2 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java @@ -24,6 +24,7 @@ import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; import org.apache.poi.util.Internal; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTEmpty; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFtnEdnRef; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc; @@ -108,6 +109,18 @@ public class XWPFParagraph { if (o instanceof CTPTab) { text.append("\t"); } + if (o instanceof CTEmpty) { + // Some inline text elements get returned not as + // themselves, but as CTEmpty, owing to some odd + // definitions around line 5642 of the XSDs + String tagName = o.getDomNode().getNodeName(); + if ("w:tab".equals(tagName)) { + text.append("\t"); + } + if ("w:cr".equals(tagName)) { + text.append("\n"); + } + } //got a reference to a footnote if (o instanceof CTFtnEdnRef) { CTFtnEdnRef ftn = (CTFtnEdnRef) o; 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 ddc0957aa0..f98d5e69ca 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java @@ -219,4 +219,22 @@ public class TestXWPFWordExtractor extends TestCase { assertTrue(extractor.getText().contains("2008")); assertTrue(extractor.getText().contains("(120 ")); } + + /** + * Test that we handle things like tabs and + * carriage returns properly in the text that + * we're extracting (bug #49189) + */ + public void testDocTabs() { + XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("WithTabs.docx"); + XWPFWordExtractor extractor = new XWPFWordExtractor(doc); + + // Check bits + assertTrue(extractor.getText().contains("a")); + assertTrue(extractor.getText().contains("\t")); + assertTrue(extractor.getText().contains("b")); + + // Now check the first paragraph in total + assertTrue(extractor.getText().contains("a\tb\n")); + } } diff --git a/test-data/document/WithTabs.docx b/test-data/document/WithTabs.docx new file mode 100644 index 0000000000000000000000000000000000000000..e9b3a7a1dc4476b82808567a491e4a576ac2e8f7 GIT binary patch literal 14190 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 U0(s8&Dl!US3FLg