From f1a1f4a6ff4cf13e0086926b890d778ab54ff53c Mon Sep 17 00:00:00 2001 From: Maxim Valyanskiy Date: Mon, 11 Jan 2010 14:27:54 +0000 Subject: [PATCH] XSLF: text extraction from tables git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@897875 13f79535-47bb-0310-9956-ffa450edef68 --- .../extractor/XSLFPowerPointExtractor.java | 58 ++++----------- .../poi/xslf/usermodel/DrawingParagraph.java | 33 +++++++++ .../poi/xslf/usermodel/DrawingTable.java | 23 ++++++ .../poi/xslf/usermodel/DrawingTableCell.java | 17 +++++ .../poi/xslf/usermodel/DrawingTableRow.java | 23 ++++++ .../poi/xslf/usermodel/DrawingTextBody.java | 23 ++++++ .../xslf/usermodel/XSLFCommonSlideData.java | 67 ++++++++++++++++++ .../apache/poi/xslf/usermodel/XSLFSlide.java | 6 ++ .../TestXSLFPowerPointExtractor.java | 13 ++++ test-data/slideshow/present1.pptx | Bin 0 -> 34047 bytes 10 files changed, 219 insertions(+), 44 deletions(-) create mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingParagraph.java create mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTable.java create mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableCell.java create mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableRow.java create mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextBody.java create mode 100644 src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommonSlideData.java create mode 100644 test-data/slideshow/present1.pptx diff --git a/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java index 9728dcfe6..bcbf176d2 100644 --- a/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java +++ b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java @@ -16,28 +16,18 @@ ==================================================================== */ package org.apache.poi.xslf.extractor; -import java.io.IOException; - import org.apache.poi.POIXMLTextExtractor; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xslf.XSLFSlideShow; +import org.apache.poi.xslf.usermodel.DrawingParagraph; import org.apache.poi.xslf.usermodel.XMLSlideShow; +import org.apache.poi.xslf.usermodel.XSLFCommonSlideData; import org.apache.poi.xslf.usermodel.XSLFSlide; import org.apache.xmlbeans.XmlException; -import org.apache.xmlbeans.XmlObject; -import org.apache.xmlbeans.XmlCursor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak; -import org.openxmlformats.schemas.presentationml.x2006.main.CTComment; -import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentList; -import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; -import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide; -import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry; +import org.openxmlformats.schemas.presentationml.x2006.main.*; + +import java.io.IOException; public class XSLFPowerPointExtractor extends POIXMLTextExtractor { private XMLSlideShow slideshow; @@ -110,7 +100,7 @@ public class XSLFPowerPointExtractor extends POIXMLTextExtractor { slideshow._getXSLFSlideShow().getSlideComments(slideId); if(slideText) { - extractText(rawSlide.getCSld().getSpTree(), text); + extractText(slides[i].getCommonSlideData(), text); // Comments too for the slide if(comments != null) { @@ -123,8 +113,9 @@ public class XSLFPowerPointExtractor extends POIXMLTextExtractor { } } } + if(notesText && notes != null) { - extractText(notes.getCSld().getSpTree(), text); + extractText(new XSLFCommonSlideData(notes.getCSld()), text); } } catch(Exception e) { throw new RuntimeException(e); @@ -134,31 +125,10 @@ public class XSLFPowerPointExtractor extends POIXMLTextExtractor { return text.toString(); } - private void extractText(CTGroupShape gs, StringBuffer text) { - CTShape[] shapes = gs.getSpArray(); - for (int i = 0; i < shapes.length; i++) { - CTTextBody textBody = - shapes[i].getTxBody(); - if(textBody != null) { - CTTextParagraph[] paras = - textBody.getPArray(); - for (int j = 0; j < paras.length; j++) { - XmlCursor c = paras[j].newCursor(); - c.selectPath("./*"); - while (c.toNextSelection()) { - XmlObject o = c.getObject(); - if(o instanceof CTRegularTextRun){ - CTRegularTextRun txrun = (CTRegularTextRun)o; - text.append( txrun.getT() ); - } else if (o instanceof CTTextLineBreak){ - text.append('\n'); - } - } - - // End each paragraph with a new line - text.append("\n"); - } - } - } - } + private void extractText(XSLFCommonSlideData data, StringBuffer text) { + for (DrawingParagraph p : data.getText()) { + text.append(p.getText()); + text.append("\n"); + } + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingParagraph.java new file mode 100644 index 000000000..fd61b26b3 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingParagraph.java @@ -0,0 +1,33 @@ +package org.apache.poi.xslf.usermodel; + +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; +import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak; +import org.apache.xmlbeans.XmlCursor; +import org.apache.xmlbeans.XmlObject; + +public class DrawingParagraph { + private final CTTextParagraph p; + + public DrawingParagraph(CTTextParagraph p) { + this.p = p; + } + + public CharSequence getText() { + StringBuilder text = new StringBuilder(); + + XmlCursor c = p.newCursor(); + c.selectPath("./*"); + while (c.toNextSelection()) { + XmlObject o = c.getObject(); + if (o instanceof CTRegularTextRun) { + CTRegularTextRun txrun = (CTRegularTextRun) o; + text.append(txrun.getT()); + } else if (o instanceof CTTextLineBreak) { + text.append('\n'); + } + } + + return text; + } +} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTable.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTable.java new file mode 100644 index 000000000..ab39cf024 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTable.java @@ -0,0 +1,23 @@ +package org.apache.poi.xslf.usermodel; + +import org.openxmlformats.schemas.drawingml.x2006.main.CTTable; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow; + +public class DrawingTable { + private final CTTable table; + + public DrawingTable(CTTable table) { + this.table = table; + } + + public DrawingTableRow[] getRows() { + CTTableRow[] ctTableRows = table.getTrArray(); + DrawingTableRow[] o = new DrawingTableRow[ctTableRows.length]; + + for (int i=0; i getText() { + CTGroupShape gs = data.getSpTree(); + + List out = new ArrayList(); + + CTShape[] shapes = gs.getSpArray(); + for (int i = 0; i < shapes.length; i++) { + CTTextBody ctTextBody = shapes[i].getTxBody(); + if (ctTextBody==null) { + continue; + } + + DrawingTextBody textBody = new DrawingTextBody(ctTextBody); + + out.addAll(Arrays.asList(textBody.getParagraphs())); + } + + CTGraphicalObjectFrame[] graphicFrames = gs.getGraphicFrameArray(); + for (CTGraphicalObjectFrame frame: graphicFrames) { + CTGraphicalObjectData data = frame.getGraphic().getGraphicData(); + XmlCursor c = data.newCursor(); + c.selectPath("./*"); + + while (c.toNextSelection()) { + XmlObject o = c.getObject(); + + if (o instanceof CTTable) { + DrawingTable table = new DrawingTable((CTTable) o); + + for (DrawingTableRow row : table.getRows()) { + for (DrawingTableCell cell : row.getCells()) { + DrawingTextBody textBody = cell.getTextBody(); + + out.addAll(Arrays.asList(textBody.getParagraphs())); + } + } + } + } + } + + return out; + } + +} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index 90de6e8a0..29af4941e 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -26,11 +26,13 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry; public class XSLFSlide extends XSLFSheet implements Slide { private CTSlide slide; private CTSlideIdListEntry slideId; + private XSLFCommonSlideData data; public XSLFSlide(CTSlide slide, CTSlideIdListEntry slideId, SlideShow parent) { super(parent); this.slide = slide; this.slideId = slideId; + this.data = new XSLFCommonSlideData(slide.getCSld()); } /** @@ -88,4 +90,8 @@ public class XSLFSlide extends XSLFSheet implements Slide { // TODO Auto-generated method stub } + + public XSLFCommonSlideData getCommonSlideData() { + return data; + } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java b/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java index 334e55646..cfb4e6518 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java @@ -113,4 +113,17 @@ public class TestXSLFPowerPointExtractor extends TestCase { // Check comments are there assertTrue("Unable to find expected word in text\n" + text, text.contains("testdoc")); } + + public void testTable() throws Exception { + POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); + xmlA = new XSLFSlideShow(OPCPackage.open(slTests.openResourceAsStream("present1.pptx"))); + XSLFPowerPointExtractor extractor = + new XSLFPowerPointExtractor(xmlA); + + String text = extractor.getText(); + assertTrue(text.length() > 0); + + // Check comments are there + assertTrue("Unable to find expected word in text\n" + text, text.contains("TEST")); + } } diff --git a/test-data/slideshow/present1.pptx b/test-data/slideshow/present1.pptx new file mode 100644 index 0000000000000000000000000000000000000000..c7f4c9f62e74dfd78bfec70adfafa816e3cb67dd GIT binary patch literal 34047 zcmeF3Wl*GBmaY?bcXxMpE8N}P-QC@_fWnGFy@#z0VF4&GWgYQcvXc&o9%UjyVo z1O|zg)($q~Iq1(1GKo!6?=ApE$>ugyD_TWV1uq|=Sp zM(U2nzj`yfO&b;?v9K`+>*YR&Al^0s?k#liU{D(CuN1vN)9pYbVG-2V%L)mZ3K|C{ zH%4YMtW2yG^g`gDAH@w1J9aaLjf{k#GKH@Mkw1LBRtYT<@y24+&zZB_$hrs-pRFxb zuC=fYRSwiuEve{>pVH{Igje3C1}9TAZ##6Di;;>{`{nW*feUYG(z0UJt*u3h>boL1 zuRxVNVfc?R4XeU*zm00`a4?j|Z3IqTA$3?(@TFW6^iY9L&7;Xl-*mI4#I3v^orFVy zH_l9GdQA6a3B=C9SH6~SBAsAZe(Z(N0#rOR#nIfs+0Z{I7-}nas=7hORQ&8)_Lo}2 z9h7X&cLf*4p-ADRn?T{oWJKSp@G14scy}avhiofAJL{-jM{nkuHOpI@6w2?U#H=WH zjA;n)l($tIxyyf0&*7osK#V)5#q`m7^>*z%=?fmh0018!AOMAbQU!}gmwd2KRoMMZ zdYDgD(04Mmab}?ZMUJvZo&m

cXdcDpsH7#IYu{wL1 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 literal 0 HcmV?d00001