From af7b947bb961e2527986ba52e7b115885f677944 Mon Sep 17 00:00:00 2001 From: Tim Allison Date: Mon, 16 Jun 2014 18:46:00 +0000 Subject: [PATCH] BUG 54771 extract text from SDTs at the cell level within a table row git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1602955 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xwpf/extractor/XWPFWordExtractor.java | 20 +-- .../poi/xwpf/usermodel/AbstractXWPFSDT.java | 113 +++++++++++++++++ .../org/apache/poi/xwpf/usermodel/ICell.java | 27 +++++ .../poi/xwpf/usermodel/ISDTContents.java | 2 +- .../apache/poi/xwpf/usermodel/XWPFSDT.java | 79 ++---------- .../poi/xwpf/usermodel/XWPFSDTCell.java | 44 +++++++ .../poi/xwpf/usermodel/XWPFSDTContent.java | 31 ++++- .../xwpf/usermodel/XWPFSDTContentCell.java | 114 ++++++++++++++++++ .../apache/poi/xwpf/usermodel/XWPFTable.java | 7 ++ .../poi/xwpf/usermodel/XWPFTableCell.java | 2 +- .../poi/xwpf/usermodel/XWPFTableRow.java | 26 ++++ .../xwpf/extractor/TestXWPFWordExtractor.java | 36 +++++- .../poi/xwpf/usermodel/TestXWPFSDT.java | 87 +++++++------ test-data/document/Bug54771a.docx | Bin 0 -> 44431 bytes test-data/document/Bug54771b.docx | Bin 0 -> 39666 bytes 15 files changed, 469 insertions(+), 119 deletions(-) create mode 100644 src/ooxml/java/org/apache/poi/xwpf/usermodel/AbstractXWPFSDT.java create mode 100644 src/ooxml/java/org/apache/poi/xwpf/usermodel/ICell.java create mode 100644 src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTCell.java create mode 100644 src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContentCell.java create mode 100644 test-data/document/Bug54771a.docx create mode 100644 test-data/document/Bug54771b.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 089ed5dc5..afff770c7 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/extractor/XWPFWordExtractor.java +++ b/src/ooxml/java/org/apache/poi/xwpf/extractor/XWPFWordExtractor.java @@ -27,6 +27,7 @@ import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.model.XWPFCommentsDecorator; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.poi.xwpf.usermodel.IBodyElement; +import org.apache.poi.xwpf.usermodel.ICell; import org.apache.poi.xwpf.usermodel.IRunElement; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFHyperlink; @@ -34,6 +35,7 @@ import org.apache.poi.xwpf.usermodel.XWPFHyperlinkRun; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRelation; import org.apache.poi.xwpf.usermodel.XWPFSDT; +import org.apache.poi.xwpf.usermodel.XWPFSDTCell; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow; @@ -161,14 +163,18 @@ public class XWPFWordExtractor extends POIXMLTextExtractor { } - private void appendTableText(StringBuffer text, XWPFTable table){ + private void appendTableText(StringBuffer text, XWPFTable table) { //this works recursively to pull embedded tables from tables - for (XWPFTableRow row : table.getRows()){ - List cells = row.getTableCells(); - for (int i = 0; i < cells.size(); i++){ - XWPFTableCell cell = cells.get(i); - text.append(cell.getTextRecursively()); - if (i < cells.size()-1){ + for (XWPFTableRow row : table.getRows()) { + List cells = row.getTableICells(); + for (int i = 0; i < cells.size(); i++) { + ICell cell = cells.get(i); + if (cell instanceof XWPFTableCell) { + text.append(((XWPFTableCell)cell).getTextRecursively()); + } else if (cell instanceof XWPFSDTCell) { + text.append(((XWPFSDTCell)cell).getContent().getText()); + } + if (i < cells.size()-1) { text.append("\t"); } } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/AbstractXWPFSDT.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/AbstractXWPFSDT.java new file mode 100644 index 000000000..9c668e845 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/AbstractXWPFSDT.java @@ -0,0 +1,113 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.xwpf.usermodel; + +import java.util.List; + +import org.apache.poi.POIXMLDocumentPart; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTString; + +/** + * Experimental abstract class that is a base for XWPFSDT and XWPFSDTCell + * + * WARNING - APIs expected to change rapidly. + * + * These classes have so far been built only for read-only processing. + * + */ +public abstract class AbstractXWPFSDT implements ISDTContents { + private final String title; + private final String tag; + private final IBody part; + + public AbstractXWPFSDT(CTSdtPr pr, IBody part){ + + List aliases = pr.getAliasList(); + if (aliases != null && aliases.size() > 0){ + title = aliases.get(0).getVal(); + } else { + title = ""; + } + List tags = pr.getTagList(); + if (tags != null && tags.size() > 0){ + tag = tags.get(0).getVal(); + } else { + tag = ""; + } + this.part = part; + + } + + /** + * + * @return first SDT Title + */ + public String getTitle(){ + return title; + } + + /** + * + * @return first SDT Tag + */ + public String getTag(){ + return tag; + } + + /** + * + * @return the content object + */ + public abstract ISDTContent getContent(); + + /** + * + * @return null + */ + public IBody getBody() { + return null; + } + + /** + * + * @return document part + */ + public POIXMLDocumentPart getPart() { + return part.getPart(); + } + + /** + * + * @return partType + */ + public BodyType getPartType() { + return BodyType.CONTENTCONTROL; + } + + /** + * + * @return element type + */ + public BodyElementType getElementType() { + return BodyElementType.CONTENTCONTROL; + } + + public XWPFDocument getDocument() { + return part.getXWPFDocument(); + } +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/ICell.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/ICell.java new file mode 100644 index 000000000..cf32924b8 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/ICell.java @@ -0,0 +1,27 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.xwpf.usermodel; + +/** + * Interface for anything that can be at a table cell level: + * {@link XWPFTableCell}, {@link XWPFSDTCell} + *

+ * Schematically something like this: + * <tr><tc/><tc/><sdt><tc/></sdt></tr> + */ +public interface ICell { +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/ISDTContents.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/ISDTContents.java index 7ee12bd2d..40776e218 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/ISDTContents.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/ISDTContents.java @@ -17,7 +17,7 @@ package org.apache.poi.xwpf.usermodel; /** - * Interface for anything that can be within a STD: + * Interface for anything that can be within an SDT: * {@link XWPFRun}, {@link XWPFTable}, {@link XWPFParagraph}, * {@link XWPFSDT} etc */ diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDT.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDT.java index a17d51f8d..4a51725b1 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDT.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDT.java @@ -16,95 +16,32 @@ ==================================================================== */ package org.apache.poi.xwpf.usermodel; -import java.util.List; - -import org.apache.poi.POIXMLDocumentPart; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtBlock; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtRun; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTString; /** * Experimental class to offer rudimentary read-only processing of * of StructuredDocumentTags/ContentControl - * - * * * WARNING - APIs expected to change rapidly * */ -public class XWPFSDT implements IBodyElement, IRunBody, ISDTContents, IRunElement { - private final String title; - private final String tag; - private final XWPFSDTContent content; - private final IBody part; +public class XWPFSDT extends AbstractXWPFSDT + implements IBodyElement, IRunBody, ISDTContents, IRunElement { + private final ISDTContent content; public XWPFSDT(CTSdtRun sdtRun, IBody part){ - this.part = part; + super(sdtRun.getSdtPr(), part); this.content = new XWPFSDTContent(sdtRun.getSdtContent(), part, this); - CTSdtPr pr = sdtRun.getSdtPr(); - List aliases = pr.getAliasList(); - if (aliases != null && aliases.size() > 0){ - title = aliases.get(0).getVal(); - } else { - title = ""; - } - @SuppressWarnings("deprecation") - CTString[] array = pr.getTagArray(); - if (array != null && array.length > 0){ - tag = array[0].getVal(); - } else { - tag = ""; - } - } + public XWPFSDT(CTSdtBlock block, IBody part){ - this.part = part; + super(block.getSdtPr(), part); this.content = new XWPFSDTContent( block.getSdtContent(), part, this); - CTSdtPr pr = block.getSdtPr(); - List aliases = pr.getAliasList(); - if (aliases != null && aliases.size() > 0){ - title = aliases.get(0).getVal(); - } else { - title = ""; - } - @SuppressWarnings("deprecation") - CTString[] array = pr.getTagArray(); - if (array != null && array.length > 0){ - tag = array[0].getVal(); - } else { - tag = ""; - } - } - public String getTitle(){ - return title; - } - public String getTag(){ - return tag; - } - public XWPFSDTContent getContent(){ + + public ISDTContent getContent(){ return content; } - public IBody getBody() { - // TODO Auto-generated method stub - return null; - } - - public POIXMLDocumentPart getPart() { - return part.getPart(); - } - - public BodyType getPartType() { - return BodyType.CONTENTCONTROL; - } - - public BodyElementType getElementType() { - return BodyElementType.CONTENTCONTROL; - } - - public XWPFDocument getDocument() { - return part.getXWPFDocument(); - } } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTCell.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTCell.java new file mode 100644 index 000000000..21cca3e7b --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTCell.java @@ -0,0 +1,44 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.xwpf.usermodel; + +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtCell; + +/** + * Experimental class to offer rudimentary read-only processing of + * of StructuredDocumentTags/ContentControl that can appear + * in a table row as if a table cell. + *

+ * These can contain one or more cells or other SDTs within them. + * + * WARNING - APIs expected to change rapidly + * + */ +public class XWPFSDTCell extends AbstractXWPFSDT implements ICell { + private final XWPFSDTContentCell cellContent; + + public XWPFSDTCell(CTSdtCell sdtCell, XWPFTableRow xwpfTableRow, IBody part){ + super(sdtCell.getSdtPr(), part); + cellContent = new XWPFSDTContentCell(sdtCell.getSdtContent(), xwpfTableRow, part); + } + + @Override + public ISDTContent getContent(){ + return cellContent; + } + +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java index de12a9216..59a0abba9 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java @@ -39,7 +39,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; * WARNING - APIs expected to change rapidly * */ -public class XWPFSDTContent { +public class XWPFSDTContent implements ISDTContent { // private final IBody part; // private final XWPFDocument document; @@ -87,10 +87,10 @@ public class XWPFSDTContent { for (int i = 0; i < bodyElements.size(); i++){ Object o = bodyElements.get(i); if (o instanceof XWPFParagraph){ - text.append(((XWPFParagraph)o).getText()); + appendParagraph((XWPFParagraph)o, text); addNewLine = true; } else if (o instanceof XWPFTable){ - text.append(((XWPFTable)o).getText()); + appendTable((XWPFTable)o, text); addNewLine = true; } else if (o instanceof XWPFSDT){ text.append(((XWPFSDT)o).getContent().getText()); @@ -106,6 +106,31 @@ public class XWPFSDTContent { return text.toString(); } + private void appendTable(XWPFTable table, StringBuilder text) { + //this works recursively to pull embedded tables from within cells + for (XWPFTableRow row : table.getRows()) { + List cells = row.getTableICells(); + for (int i = 0; i < cells.size(); i++) { + ICell cell = cells.get(i); + if (cell instanceof XWPFTableCell) { + text.append(((XWPFTableCell)cell).getTextRecursively()); + } else if (cell instanceof XWPFSDTCell) { + text.append(((XWPFSDTCell)cell).getContent().getText()); + } + if (i < cells.size()-1) { + text.append("\t"); + } + } + text.append('\n'); + } + } + + private void appendParagraph(XWPFParagraph paragraph, StringBuilder text) { + for(IRunElement run : paragraph.getRuns()) { + text.append(run.toString()); + } + } + public String toString(){ return getText(); } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContentCell.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContentCell.java new file mode 100644 index 000000000..25e258a5c --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContentCell.java @@ -0,0 +1,114 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.xwpf.usermodel; + + +import javax.xml.namespace.QName; + +import org.apache.xmlbeans.XmlCursor; +import org.apache.xmlbeans.XmlCursor.TokenType; + +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentCell; + + + +/** + * Experimental class to offer rudimentary read-only processing of + * of the XWPFSDTCellContent. + + * WARNING - APIs expected to change rapidly + * + */ +public class XWPFSDTContentCell implements ISDTContent { + + //A full implementation would grab the icells + //that a content cell can contain. This would require + //significant changes, including changing the notion that the + //parent of a cell can be not just a row, but an sdt. + //For now we are just grabbing the text out of the text tokentypes. + + //private List cells = new ArrayList(). + + private String text = ""; + public XWPFSDTContentCell(CTSdtContentCell sdtContentCell, + XWPFTableRow xwpfTableRow, IBody part){ + super(); + StringBuilder sb = new StringBuilder(); + XmlCursor cursor = sdtContentCell.newCursor(); + + //keep track of the following, + //and add "\n" only before the start of a body + //element if it is not the first body element. + + //index of cell in row + int tcCnt = 0; + //count of body objects + int iBodyCnt = 0; + int depth = 1; + + while (cursor.hasNextToken() && depth > 0) { + TokenType t = cursor.toNextToken(); + if (t.isText()){ + sb.append(cursor.getTextValue()); + } else if (isStartToken(cursor, "tr")) { + tcCnt = 0; + iBodyCnt = 0; + } else if (isStartToken(cursor, "tc")) { + if (tcCnt++ > 0) { + sb.append("\t"); + } + iBodyCnt = 0; + } else if (isStartToken(cursor, "p") || + isStartToken(cursor, "tbl") || + isStartToken(cursor, "sdt")) { + if (iBodyCnt > 0) { + sb.append("\n"); + } + iBodyCnt++; + } + if (cursor.isStart()){ + depth++; + } else if (cursor.isEnd()){ + depth--; + } + } + text = sb.toString(); + } + + + + private boolean isStartToken(XmlCursor cursor, String string) { + if (! cursor.isStart()) { + return false; + } + QName qName = cursor.getName(); + if (qName != null && qName.getLocalPart() != null && + qName.getLocalPart().equals(string)) { + return true; + } + return false; + } + + + public String getText(){ + return text; + } + + public String toString(){ + return getText(); + } +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java index c2b1c175f..554e7bef2 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java @@ -159,6 +159,13 @@ public class XWPFTable implements IBodyElement, ISDTContents { } /** + * Convenience method to extract text in cells. This + * does not extract text recursively in cells, and it does not + * currently include text in SDT (form) components. + *

+ * To get all text within a table, see XWPFWordExtractor's appendTableText + * as an example. + * * @return text */ public String getText() { diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java index 148bd2072..e1b46fecd 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java @@ -42,7 +42,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc; * Represents a Cell within a {@link XWPFTable}. The * Cell is the thing that holds the actual content (paragraphs etc) */ -public class XWPFTableCell implements IBody { +public class XWPFTableCell implements IBody, ICell { private final CTTc ctTc; protected List paragraphs = null; protected List tables = null; diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java index a16b247a5..56ea38745 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java @@ -21,9 +21,12 @@ import java.util.ArrayList; import java.util.List; import org.apache.poi.util.Internal; +import org.apache.xmlbeans.XmlCursor; +import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHeight; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtCell; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTrPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; @@ -121,6 +124,29 @@ public class XWPFTableRow { return table; } + /** + * create and return a list of all XWPFTableCell + * who belongs to this row + * @return a list of {@link XWPFTableCell} + */ + public List getTableICells(){ + + List cells = new ArrayList(); + //Can't use ctRow.getTcList because that only gets table cells + //Can't use ctRow.getSdtList because that only gets sdts that are at cell level + XmlCursor cursor = ctRow.newCursor(); + cursor.selectPath("./*"); + while (cursor.toNextSelection()) { + XmlObject o = cursor.getObject(); + if (o instanceof CTTc){ + cells.add(new XWPFTableCell((CTTc)o, this, table.getBody())); + } else if (o instanceof CTSdtCell) { + cells.add(new XWPFSDTCell((CTSdtCell)o, this, table.getBody())); + } + } + return cells; + } + /** * create and return a list of all XWPFTableCell * who belongs to this row 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 6b9f7125e..d63bd642d 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java @@ -18,6 +18,8 @@ package org.apache.poi.xwpf.extractor; import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import junit.framework.TestCase; @@ -327,12 +329,14 @@ public class TestXWPFWordExtractor extends TestCase { String[] targs = new String[]{ "header_rich_text", "rich_text", - "rich_text_pre_table\nrich_text_cell1\t\t\t\n\nrich_text_post_table", + "rich_text_pre_table\nrich_text_cell1\t\t\t\n\t\t\t\n\t\t\t\n\nrich_text_post_table", "plain_text_no_newlines", "plain_text_with_newlines1\nplain_text_with_newlines2\n", "watermelon\n", "dirt\n", "4/16/2013\n", + "rich_text_in_cell", + "abc", "rich_text_in_paragraph_in_cell", "footer_rich_text", "footnote_sdt", @@ -352,6 +356,36 @@ public class TestXWPFWordExtractor extends TestCase { } assertEquals("controlled content loading hit count", targs.length, hits); ex.close(); + + + doc = XWPFTestDataSamples.openSampleDocument("Bug54771a.docx"); + targs = new String[]{ + "bb", + "test subtitle\n", + "test user\n", + }; + ex = new XWPFWordExtractor(doc); + s = ex.getText().toLowerCase(); + + //At one point in development there were three copies of the text. + //This ensures that there is only one copy. + for (String targ : targs){ + Matcher m = Pattern.compile(targ).matcher(s); + int hit = 0; + while (m.find()) { + hit++; + } + assertEquals("controlled content loading-"+targ, 1, hit); + } + //"test\n" appears twice: once as the "title" and once in the text. + //This also happens when you save this document as text from MSWord. + Matcher m = Pattern.compile("test\n").matcher(s); + int hit = 0; + while (m.find()){ + hit++; + } + assertEquals("test", 2, hit); + ex.close(); } /** No Header or Footer in document */ diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java index f1a585567..f4114c962 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java @@ -18,8 +18,10 @@ package org.apache.poi.xwpf.usermodel; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import junit.framework.TestCase; @@ -35,15 +37,16 @@ public final class TestXWPFSDT extends TestCase { XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Bug54849.docx"); String tag = null; String title= null; - List sdts = extractAllSDTs(doc); - for (XWPFSDT sdt :sdts){ + List sdts = extractAllSDTs(doc); + for (AbstractXWPFSDT sdt :sdts){ if (sdt.getContent().toString().equals("Rich_text")){ tag = "MyTag"; title = "MyTitle"; break; } + } - assertEquals("controls size", 12, sdts.size()); + assertEquals("controls size", 13, sdts.size()); assertEquals("tag", "MyTag", tag); assertEquals("title", "MyTitle", title); @@ -54,12 +57,13 @@ public final class TestXWPFSDT extends TestCase { String[] contents = new String[]{ "header_rich_text", "Rich_text", - "Rich_text_pre_table\nRich_text_cell1\t\t\t\n\nRich_text_post_table", + "Rich_text_pre_table\nRich_text_cell1\t\t\t\n\t\t\t\n\t\t\t\n\nRich_text_post_table", "Plain_text_no_newlines", "Plain_text_with_newlines1\nplain_text_with_newlines2", "Watermelon", "Dirt", "4/16/2013", + "Rich_text_in_cell", "rich_text_in_paragraph_in_cell", "Footer_rich_text", "Footnote_sdt", @@ -67,31 +71,40 @@ public final class TestXWPFSDT extends TestCase { }; XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Bug54849.docx"); - List sdts = extractAllSDTs(doc); + List sdts = extractAllSDTs(doc); assertEquals("number of sdts", contents.length, sdts.size()); - for (int i = 0; i < sdts.size(); i++){//contents.length; i++){ - XWPFSDT sdt = sdts.get(i); - + for (int i = 0; i < contents.length; i++){ + AbstractXWPFSDT sdt = sdts.get(i); assertEquals(i+ ": " + contents[i], contents[i], sdt.getContent().toString()); } } + /** + * POI-54771 and TIKA-1317 + */ + public void testSDTAsCell() throws Exception { + //Bug54771a.docx and Bug54771b.docx test slightly + //different recursion patterns. Keep both! + XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Bug54771a.docx"); + List sdts = extractAllSDTs(doc); + String text = sdts.get(0).getContent().getText(); + assertEquals(2, sdts.size()); + assertTrue(text.indexOf("Test") > -1); + + text = sdts.get(1).getContent().getText(); + assertTrue(text.indexOf("Test Subtitle") > -1); + assertTrue(text.indexOf("Test User") > -1); + assertTrue(text.indexOf("Test") < text.indexOf("Test Subtitle")); + + doc = XWPFTestDataSamples.openSampleDocument("Bug54771b.docx"); + sdts = extractAllSDTs(doc); + assertEquals(3, sdts.size()); + assertTrue(sdts.get(0).getContent().getText().indexOf("Test") > -1); + + assertTrue(sdts.get(1).getContent().getText().indexOf("Test Subtitle") > -1); + assertTrue(sdts.get(2).getContent().getText().indexOf("Test User") > -1); - public void testFailureToGetSDTAsCell() throws Exception{ - /** - * The current code fails to extract an sdt if it comprises/is the parent - * of a cell in a table. - */ - XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Bug54849.docx"); - List sdts = extractAllSDTs(doc); - boolean found = false; - for (XWPFSDT sdt : sdts){ - if (sdt.getContent().getText().toLowerCase().indexOf("rich_text_in_cell") > -1){ - found = true; - } - } - assertEquals("SDT as cell known failure", false, found); } /** @@ -99,7 +112,7 @@ public final class TestXWPFSDT extends TestCase { */ public void testNewLinesBetweenRuns() throws Exception{ XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Bug55142.docx"); - List sdts = extractAllSDTs(doc); + List sdts = extractAllSDTs(doc); List targs = new ArrayList(); //these test newlines and tabs in paragraphs/body elements targs.add("Rich-text1 abcdefghi"); @@ -114,14 +127,14 @@ public final class TestXWPFSDT extends TestCase { targs.add("sdt_incell2 abcdefg"); for (int i = 0; i < sdts.size(); i++){ - XWPFSDT sdt = sdts.get(i); + AbstractXWPFSDT sdt = sdts.get(i); assertEquals(targs.get(i), targs.get(i), sdt.getContent().getText()); } } - private List extractAllSDTs(XWPFDocument doc){ - - List sdts = new ArrayList(); + private List extractAllSDTs(XWPFDocument doc){ + + List sdts = new ArrayList(); List headers = doc.getHeaderList(); for (XWPFHeader header : headers){ @@ -135,7 +148,6 @@ public final class TestXWPFSDT extends TestCase { } for (XWPFFootnote footnote : doc.getFootnotes()){ - sdts.addAll(extractSDTsFromBodyElements(footnote.getBodyElements())); } for (Map.Entry e : doc.endnotes.entrySet()){ @@ -144,8 +156,8 @@ public final class TestXWPFSDT extends TestCase { return sdts; } - private List extractSDTsFromBodyElements(List elements){ - List sdts = new ArrayList(); + private List extractSDTsFromBodyElements(List elements){ + List sdts = new ArrayList(); for (IBodyElement e : elements){ if (e instanceof XWPFSDT){ XWPFSDT sdt = (XWPFSDT)e; @@ -167,11 +179,16 @@ public final class TestXWPFSDT extends TestCase { return sdts; } - private List extractSDTsFromTable(XWPFTable table){ - List sdts = new ArrayList(); - for (XWPFTableRow r : table.getRows()){ - for (XWPFTableCell c : r.getTableCells()){ - sdts.addAll(extractSDTsFromBodyElements(c.getBodyElements())); + private List extractSDTsFromTable(XWPFTable table) { + + List sdts = new ArrayList(); + for (XWPFTableRow r : table.getRows()) { + for (ICell c : r.getTableICells()) { + if (c instanceof XWPFSDTCell) { + sdts.add((XWPFSDTCell)c); + } else if (c instanceof XWPFTableCell) { + sdts.addAll(extractSDTsFromBodyElements(((XWPFTableCell)c).getBodyElements())); + } } } return sdts; diff --git a/test-data/document/Bug54771a.docx b/test-data/document/Bug54771a.docx new file mode 100644 index 0000000000000000000000000000000000000000..19bbbd1a456831e456d37e2c3043e389a010bf42 GIT binary patch literal 44431 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

}?69UOp+B30%xzO#M)AUj_MykA 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%0A-$t-# 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 Ze+`(R@<_-x74U!`9pL-OC-&yi{{uBjTKxb3 literal 0 HcmV?d00001