| /* ==================================================================== |
| 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.ArrayList; |
| import java.util.List; |
| |
| |
| import org.apache.xmlbeans.XmlCursor; |
| import org.apache.xmlbeans.XmlObject; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; |
| |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtBlock; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentBlock; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentRun; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; |
| |
| /** |
| * Experimental class to offer rudimentary read-only processing of |
| * of the contentblock of an SDT/ContentControl. |
| * |
| * |
| * |
| * WARNING - APIs expected to change rapidly |
| * |
| */ |
| public class XWPFSDTContent implements ISDTContent { |
| |
| // private final IBody part; |
| // private final XWPFDocument document; |
| private List<XWPFParagraph> paragraphs = new ArrayList<XWPFParagraph>(); |
| private List<XWPFTable> tables = new ArrayList<XWPFTable>(); |
| private List<XWPFRun> runs = new ArrayList<XWPFRun>(); |
| private List<XWPFSDT> contentControls = new ArrayList<XWPFSDT>(); |
| private List<ISDTContents> bodyElements = new ArrayList<ISDTContents>(); |
| |
| public XWPFSDTContent(CTSdtContentRun sdtRun, IBody part, IRunBody parent){ |
| for (CTR ctr : sdtRun.getRArray()){ |
| XWPFRun run = new XWPFRun(ctr, parent); |
| runs.add(run); |
| bodyElements.add(run); |
| } |
| } |
| public XWPFSDTContent(CTSdtContentBlock block, IBody part, IRunBody parent){ |
| XmlCursor cursor = block.newCursor(); |
| cursor.selectPath("./*"); |
| while (cursor.toNextSelection()) { |
| XmlObject o = cursor.getObject(); |
| if (o instanceof CTP) { |
| XWPFParagraph p = new XWPFParagraph((CTP) o, part); |
| bodyElements.add(p); |
| paragraphs.add(p); |
| } else if (o instanceof CTTbl) { |
| XWPFTable t = new XWPFTable((CTTbl) o, part); |
| bodyElements.add(t); |
| tables.add(t); |
| } else if (o instanceof CTSdtBlock){ |
| XWPFSDT c = new XWPFSDT(((CTSdtBlock)o), part); |
| bodyElements.add(c); |
| contentControls.add(c); |
| } else if (o instanceof CTR) { |
| XWPFRun run = new XWPFRun((CTR) o, parent); |
| runs.add(run); |
| bodyElements.add(run); |
| } |
| } |
| } |
| |
| public String getText(){ |
| StringBuilder text = new StringBuilder(); |
| boolean addNewLine = false; |
| for (int i = 0; i < bodyElements.size(); i++){ |
| Object o = bodyElements.get(i); |
| if (o instanceof XWPFParagraph){ |
| appendParagraph((XWPFParagraph)o, text); |
| addNewLine = true; |
| } else if (o instanceof XWPFTable){ |
| appendTable((XWPFTable)o, text); |
| addNewLine = true; |
| } else if (o instanceof XWPFSDT){ |
| text.append(((XWPFSDT)o).getContent().getText()); |
| addNewLine = true; |
| } else if (o instanceof XWPFRun){ |
| text.append(((XWPFRun)o).toString()); |
| addNewLine = false; |
| } |
| if (addNewLine == true && i < bodyElements.size()-1){ |
| text.append("\n"); |
| } |
| } |
| 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<ICell> 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(); |
| } |
| }
|