From ac57e34264305add6076f18173876135f3da1ed0 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Wed, 5 Nov 2014 22:26:00 +0000 Subject: [PATCH] github-7 - Form check box extraction with XWPFWordExtractor git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1636990 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xwpf/usermodel/XWPFRun.java | 49 +++++++----------- .../xwpf/extractor/TestXWPFWordExtractor.java | 13 +++++ test-data/document/checkboxes.docx | Bin 0 -> 20800 bytes 3 files changed, 31 insertions(+), 31 deletions(-) create mode 100644 test-data/document/checkboxes.docx diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java index dc09b43d46..9234d18506 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java @@ -34,42 +34,13 @@ import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlString; import org.apache.xmlbeans.XmlToken; import org.apache.xmlbeans.impl.values.XmlAnyTypeImpl; -import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip; -import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject; -import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData; -import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; -import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualPictureProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D; -import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D; -import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType; +import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture; import org.openxmlformats.schemas.drawingml.x2006.picture.CTPictureNonVisual; import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor; import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTColor; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTEmpty; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFtnEdnRef; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHpsMeasure; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPTab; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSignedHpsMeasure; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTUnderline; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVerticalAlignRun; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrClear; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrType; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun; import org.w3c.dom.NodeList; import org.w3c.dom.Text; @@ -894,6 +865,22 @@ public class XWPFRun implements ISDTContents, IRunElement{ text.append(((CTText) o).getStringValue()); } } + + // Complex type evaluation (currently only for extraction of check boxes) + if(o instanceof CTFldChar) { + CTFldChar ctfldChar = ((CTFldChar)o); + if(ctfldChar.getFldCharType() == STFldCharType.BEGIN) { + if(ctfldChar.getFfData() != null) { + for(CTFFCheckBox checkBox : ctfldChar.getFfData().getCheckBoxList()) { + if(checkBox.getDefault().getVal() == STOnOff.X_1) { + text.append("|X|"); + } else { + text.append("|_|"); + } + } + } + } + } if (o instanceof CTPTab) { text.append("\t"); 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 d63bd642de..00408829df 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/extractor/TestXWPFWordExtractor.java @@ -397,4 +397,17 @@ public class TestXWPFWordExtractor extends TestCase { extractor.getText(); extractor.close(); } + + public void testCheckboxes() throws IOException { + XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("checkboxes.docx"); + System.out.println(doc); + XWPFWordExtractor extractor = new XWPFWordExtractor(doc); + + assertEquals("This is a small test for checkboxes \nunchecked: |_| \n" + + "Or checked: |X|\n\n\n\n\n" + + "Test a checkbox within a textbox: |_| -> |X|\n\n\n" + + "In Table:\n|_|\t|X|\n\n\n" + + "In Sequence:\n|X||_||X|\n", extractor.getText()); + extractor.close(); + } } diff --git a/test-data/document/checkboxes.docx b/test-data/document/checkboxes.docx new file mode 100644 index 0000000000000000000000000000000000000000..c35b71598f22b242347f8fca17ea0ea5b41601e1 GIT binary patch literal 20800 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 literal 0 HcmV?d00001