This is an automated email from the ASF dual-hosted git repository.
tallison pushed a commit to branch TIKA-3164
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/TIKA-3164 by this push:
new de88e02 TIKA-3164 update POI to 5.1.0
de88e02 is described below
commit de88e0223c3a7f0afed448b3c06f1c7c0e80dbc6
Author: tallison <[email protected]>
AuthorDate: Fri Dec 10 16:07:09 2021 -0500
TIKA-3164 update POI to 5.1.0
---
CHANGES.txt | 6 +-
tika-parent/pom.xml | 2 +-
.../detect/microsoft/ooxml/OPCPackageDetector.java | 3 +-
.../microsoft/ooxml/OOXMLExtractorFactory.java | 12 +-
.../parser/microsoft/ooxml/OPCPackageWrapper.java | 39 ++
.../microsoft/ooxml/TikaXSSFSheetXMLHandler.java | 411 +++++++++++++++++++++
.../ooxml/XSSFExcelExtractorDecorator.java | 5 +-
.../xslf/XSLFEventBasedPowerPointExtractor.java | 24 +-
.../ooxml/xwpf/XWPFEventBasedWordExtractor.java | 19 -
.../src/test/resources/log4j2.xml | 40 ++
10 files changed, 508 insertions(+), 53 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 278d46b..d480e39 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,8 @@
-Release 2.1.1 - ???
+Release 2.2.0 - ???
+
+ * Upgraded Apache POI to 5.1.0. NOTE: This results in an increase
+ of several orders of magnitude in logging. See http://xyz for an example
+ of how to turn off logging for POI. (TIKA-3164).
* Fix default logging in tika-app in batch mode (TIKA-3589).
diff --git a/tika-parent/pom.xml b/tika-parent/pom.xml
index d0b673f..38af7e8 100644
--- a/tika-parent/pom.xml
+++ b/tika-parent/pom.xml
@@ -561,7 +561,7 @@
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
- <version>1.3.2</version>
+ <version>${javax.annotation.version}</version>
</dependency>
<dependency>
<groupId>javax.xml.soap</groupId>
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/ooxml/OPCPackageDetector.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/ooxml/OPCPackageDetector.java
index 64a39e2..77995bc 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/ooxml/OPCPackageDetector.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/ooxml/OPCPackageDetector.java
@@ -51,6 +51,7 @@ import org.apache.tika.detect.zip.ZipContainerDetector;
import org.apache.tika.io.TikaInputStream;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.microsoft.ooxml.OPCPackageWrapper;
import org.apache.tika.sax.OfflineContentHandler;
import org.apache.tika.sax.StoppingEarlyException;
import org.apache.tika.utils.XMLReaderUtils;
@@ -259,7 +260,7 @@ public class OPCPackageDetector implements
ZipContainerDetector {
}
((CloseShieldZipFileZipEntrySource)zipEntrySource).allowClose();
//only set the open container if we made it here
- stream.setOpenContainer(pkg);
+ stream.setOpenContainer(new OPCPackageWrapper(pkg));
return type;
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
index c15b003..ec15fed 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
@@ -99,8 +99,8 @@ public class OOXMLExtractorFactory {
// Locate or Open the OPCPackage for the file
TikaInputStream tis = TikaInputStream.cast(stream);
- if (tis != null && tis.getOpenContainer() instanceof OPCPackage) {
- pkg = (OPCPackage) tis.getOpenContainer();
+ if (tis != null && tis.getOpenContainer() instanceof
OPCPackageWrapper) {
+ pkg = ((OPCPackageWrapper)
tis.getOpenContainer()).getOPCPackage();
} else if (tis != null && tis.hasFile()) {
try {
pkg = OPCPackage.open(tis.getFile().getPath(),
PackageAccess.READ);
@@ -109,7 +109,7 @@ public class OOXMLExtractorFactory {
ZipSalvager.salvageCopy(tis.getFile(), tmpRepairedCopy);
pkg = OPCPackage.open(tmpRepairedCopy, PackageAccess.READ);
}
- tis.setOpenContainer(pkg);
+ tis.setOpenContainer(new OPCPackageWrapper(pkg));
} else {
//OPCPackage slurps rris into memory so we can close rris
//without apparent problems
@@ -252,11 +252,7 @@ public class OOXMLExtractorFactory {
} finally {
if (tmpRepairedCopy != null) {
if (pkg != null) {
- try {
- pkg.close();
- } catch (IOException e) {
- LOG.warn("problem closing pkg file");
- }
+ pkg.revert();
}
boolean deleted = tmpRepairedCopy.delete();
if (!deleted) {
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OPCPackageWrapper.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OPCPackageWrapper.java
new file mode 100644
index 0000000..e58afa2
--- /dev/null
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OPCPackageWrapper.java
@@ -0,0 +1,39 @@
+/*
+ * 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.tika.parser.microsoft.ooxml;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import org.apache.poi.openxml4j.opc.OPCPackage;
+
+public class OPCPackageWrapper implements Closeable {
+ private final OPCPackage opcPackage;
+
+ public OPCPackageWrapper(OPCPackage opcPackage) {
+ this.opcPackage = opcPackage;
+ }
+
+ @Override
+ public void close() throws IOException {
+ opcPackage.revert();
+ }
+
+ public OPCPackage getOPCPackage() {
+ return opcPackage;
+ }
+}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/TikaXSSFSheetXMLHandler.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/TikaXSSFSheetXMLHandler.java
new file mode 100644
index 0000000..ad2ac8e
--- /dev/null
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/TikaXSSFSheetXMLHandler.java
@@ -0,0 +1,411 @@
+/*
+ * 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.tika.parser.microsoft.ooxml;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Queue;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.poi.ss.usermodel.BuiltinFormats;
+import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.RichTextString;
+import org.apache.poi.ss.util.CellAddress;
+import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
+import org.apache.poi.xssf.model.Comments;
+import org.apache.poi.xssf.model.SharedStrings;
+import org.apache.poi.xssf.model.Styles;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFComment;
+import org.apache.poi.xssf.usermodel.XSSFRichTextString;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * This is a temporary work around for POI 5.1.0:
https://bz.apache.org/bugzilla/show_bug.cgi?id=65676
+ */
+public class TikaXSSFSheetXMLHandler extends DefaultHandler {
+ private static final Logger LOG =
LogManager.getLogger(TikaXSSFSheetXMLHandler.class);
+ private Styles stylesTable;
+ private Comments comments;
+ private SharedStrings sharedStringsTable;
+ private final XSSFSheetXMLHandler.SheetContentsHandler
sheetContentsHandler;
+ private boolean vIsOpen;
+ private boolean fIsOpen;
+ private boolean isIsOpen;
+ private boolean hfIsOpen;
+ private xssfDataType nextDataType;
+ private short formatIndex;
+ private String formatString;
+ private final DataFormatter formatter;
+ private int rowNum;
+ private int nextRowNum;
+ private String cellRef;
+ private boolean formulasNotResults;
+ private StringBuilder value;
+ private StringBuilder formula;
+ private StringBuilder headerFooter;
+ private Queue<CellAddress> commentCellRefs;
+
+ public TikaXSSFSheetXMLHandler(Styles styles, Comments comments,
SharedStrings strings,
+ XSSFSheetXMLHandler.SheetContentsHandler
sheetContentsHandler,
+ DataFormatter dataFormatter, boolean
formulasNotResults) {
+ this.value = new StringBuilder(64);
+ this.formula = new StringBuilder(64);
+ this.headerFooter = new StringBuilder(64);
+ this.stylesTable = styles;
+ this.comments = comments;
+ this.sharedStringsTable = strings;
+ this.sheetContentsHandler = sheetContentsHandler;
+ this.formulasNotResults = formulasNotResults;
+ this.nextDataType = xssfDataType.NUMBER;
+ this.formatter = dataFormatter;
+ this.init(comments);
+ }
+
+ public TikaXSSFSheetXMLHandler(Styles styles, SharedStrings strings,
+ XSSFSheetXMLHandler.SheetContentsHandler
sheetContentsHandler,
+ DataFormatter dataFormatter, boolean
formulasNotResults) {
+ this(styles, (Comments) null, strings, sheetContentsHandler,
dataFormatter,
+ formulasNotResults);
+ }
+
+ public TikaXSSFSheetXMLHandler(Styles styles, SharedStrings strings,
+ XSSFSheetXMLHandler.SheetContentsHandler
sheetContentsHandler,
+ boolean formulasNotResults) {
+ this(styles, strings, sheetContentsHandler, new DataFormatter(),
formulasNotResults);
+ }
+
+ private void init(Comments commentsTable) {
+ if (commentsTable != null) {
+ this.commentCellRefs = new LinkedList();
+ Iterator<CellAddress> iter = commentsTable.getCellAddresses();
+
+ while (iter.hasNext()) {
+ this.commentCellRefs.add(iter.next());
+ }
+ }
+ }
+
+ private boolean isTextTag(String name) {
+ if ("v".equals(name)) {
+ return true;
+ } else if ("inlineStr".equals(name)) {
+ return true;
+ } else {
+ return "t".equals(name) && this.isIsOpen;
+ }
+ }
+
+ public void startElement(String uri, String localName, String qName,
Attributes attributes)
+ throws SAXException {
+ if (uri == null ||
+
uri.equals("http://schemas.openxmlformats.org/spreadsheetml/2006/main")) {
+ if (this.isTextTag(localName)) {
+ this.vIsOpen = true;
+ if (!this.isIsOpen) {
+ this.value.setLength(0);
+ }
+ } else if ("is".equals(localName)) {
+ this.isIsOpen = true;
+ } else {
+ String cellType;
+ String cellStyleStr;
+ if ("f".equals(localName)) {
+ this.formula.setLength(0);
+ if (this.nextDataType == xssfDataType.NUMBER) {
+ this.nextDataType = xssfDataType.FORMULA;
+ }
+
+ cellType = attributes.getValue("t");
+ if (cellType != null && cellType.equals("shared")) {
+ cellStyleStr = attributes.getValue("ref");
+ String si = attributes.getValue("si");
+ if (cellStyleStr != null) {
+ this.fIsOpen = true;
+ } else if (this.formulasNotResults) {
+ LOG.atWarn().log("shared formulas not yet
supported!");
+ }
+ } else {
+ this.fIsOpen = true;
+ }
+ } else if (!"oddHeader".equals(localName) &&
!"evenHeader".equals(localName) &&
+ !"firstHeader".equals(localName) &&
!"firstFooter".equals(localName) &&
+ !"oddFooter".equals(localName) &&
!"evenFooter".equals(localName)) {
+ if ("row".equals(localName)) {
+ cellType = attributes.getValue("r");
+ if (cellType != null) {
+ this.rowNum = Integer.parseInt(cellType) - 1;
+ } else {
+ this.rowNum = this.nextRowNum;
+ }
+
+ this.sheetContentsHandler.startRow(this.rowNum);
+ } else if ("c".equals(localName)) {
+ this.nextDataType = xssfDataType.NUMBER;
+ this.formatIndex = -1;
+ this.formatString = null;
+ this.cellRef = attributes.getValue("r");
+ cellType = attributes.getValue("t");
+ cellStyleStr = attributes.getValue("s");
+ if ("b".equals(cellType)) {
+ this.nextDataType = xssfDataType.BOOLEAN;
+ } else if ("e".equals(cellType)) {
+ this.nextDataType = xssfDataType.ERROR;
+ } else if ("inlineStr".equals(cellType)) {
+ this.nextDataType = xssfDataType.INLINE_STRING;
+ } else if ("s".equals(cellType)) {
+ this.nextDataType = xssfDataType.SST_STRING;
+ } else if ("str".equals(cellType)) {
+ this.nextDataType = xssfDataType.FORMULA;
+ } else {
+ XSSFCellStyle style = null;
+ if (this.stylesTable != null) {
+ if (cellStyleStr != null) {
+ int styleIndex =
Integer.parseInt(cellStyleStr);
+ style =
this.stylesTable.getStyleAt(styleIndex);
+ } else if (this.stylesTable.getNumCellStyles()
> 0) {
+ style = this.stylesTable.getStyleAt(0);
+ }
+ }
+
+ if (style != null) {
+ this.formatIndex = style.getDataFormat();
+ this.formatString =
style.getDataFormatString();
+ if (this.formatString == null) {
+ this.formatString =
+
BuiltinFormats.getBuiltinFormat(this.formatIndex);
+ }
+ }
+ }
+ }
+ } else {
+ this.hfIsOpen = true;
+ this.headerFooter.setLength(0);
+ }
+ }
+
+ }
+ }
+
+ public void endElement(String uri, String localName, String qName) throws
SAXException {
+ if (uri == null ||
+
uri.equals("http://schemas.openxmlformats.org/spreadsheetml/2006/main")) {
+ if (this.isTextTag(localName)) {
+ this.vIsOpen = false;
+ if (!this.isIsOpen) {
+ this.outputCell();
+ }
+ } else if ("f".equals(localName)) {
+ this.fIsOpen = false;
+ } else if ("is".equals(localName)) {
+ this.isIsOpen = false;
+ this.outputCell();
+ this.value.setLength(0);
+ } else if ("row".equals(localName)) {
+
this.checkForEmptyCellComments(EmptyCellCommentsCheckType.END_OF_ROW);
+ this.sheetContentsHandler.endRow(this.rowNum);
+ this.nextRowNum = this.rowNum + 1;
+ } else if ("sheetData".equals(localName)) {
+
this.checkForEmptyCellComments(EmptyCellCommentsCheckType.END_OF_SHEET_DATA);
+ this.sheetContentsHandler.endSheet();
+ } else if (!"oddHeader".equals(localName) &&
!"evenHeader".equals(localName) &&
+ !"firstHeader".equals(localName)) {
+ if ("oddFooter".equals(localName) ||
"evenFooter".equals(localName) ||
+ "firstFooter".equals(localName)) {
+ this.hfIsOpen = false;
+
this.sheetContentsHandler.headerFooter(this.headerFooter.toString(), false,
+ localName);
+ }
+ } else {
+ this.hfIsOpen = false;
+
this.sheetContentsHandler.headerFooter(this.headerFooter.toString(), true,
+ localName);
+ }
+
+ }
+ }
+
+ public void characters(char[] ch, int start, int length) throws
SAXException {
+ if (this.vIsOpen) {
+ this.value.append(ch, start, length);
+ }
+
+ if (this.fIsOpen) {
+ this.formula.append(ch, start, length);
+ }
+
+ if (this.hfIsOpen) {
+ this.headerFooter.append(ch, start, length);
+ }
+
+ }
+
+ private void outputCell() {
+ String thisStr = null;
+ switch (this.nextDataType) {
+ case BOOLEAN:
+ char first = this.value.charAt(0);
+ thisStr = first == '0' ? "FALSE" : "TRUE";
+ break;
+ case ERROR:
+ thisStr = "ERROR:" + this.value;
+ break;
+ case FORMULA:
+ if (this.formulasNotResults) {
+ thisStr = this.formula.toString();
+ } else {
+ String fv = this.value.toString();
+ if (this.formatString != null) {
+ try {
+ double d = Double.parseDouble(fv);
+ thisStr = this.formatter.formatRawCellContents(d,
this.formatIndex,
+ this.formatString);
+ } catch (NumberFormatException var8) {
+ thisStr = fv;
+ }
+ } else {
+ thisStr = fv;
+ }
+ }
+ break;
+ case INLINE_STRING:
+ XSSFRichTextString rtsi = new
XSSFRichTextString(this.value.toString());
+ thisStr = rtsi.toString();
+ break;
+ case SST_STRING:
+ String sstIndex = this.value.toString();
+
+ try {
+ int idx = Integer.parseInt(sstIndex);
+ RichTextString rtss =
this.sharedStringsTable.getItemAt(idx);
+ thisStr = rtss.toString();
+ } catch (NumberFormatException var7) {
+ LOG.atError().withThrowable(var7)
+ .log("Failed to parse SST index '{}'", sstIndex);
+ }
+ break;
+ case NUMBER:
+ String n = this.value.toString();
+ if (this.formatString != null && n.length() > 0) {
+ thisStr =
this.formatter.formatRawCellContents(Double.parseDouble(n),
+ this.formatIndex, this.formatString);
+ } else {
+ thisStr = n;
+ }
+ break;
+ default:
+ thisStr = "(TODO: Unexpected type: " + this.nextDataType + ")";
+ }
+
+ this.checkForEmptyCellComments(EmptyCellCommentsCheckType.CELL);
+ XSSFComment comment = this.comments != null ?
+ this.comments.findCellComment(new CellAddress(this.cellRef)) :
null;
+ this.sheetContentsHandler.cell(this.cellRef, thisStr, comment);
+ this.value.setLength(0);
+ }
+
+ private void checkForEmptyCellComments(EmptyCellCommentsCheckType type) {
+ if (this.commentCellRefs != null && !this.commentCellRefs.isEmpty()) {
+ if (type == EmptyCellCommentsCheckType.END_OF_SHEET_DATA) {
+ while (!this.commentCellRefs.isEmpty()) {
+ this.outputEmptyCellComment((CellAddress)
this.commentCellRefs.remove());
+ }
+
+ return;
+ }
+
+ if (this.cellRef == null) {
+ if (type == EmptyCellCommentsCheckType.END_OF_ROW) {
+ while (!this.commentCellRefs.isEmpty()) {
+ if (((CellAddress)
this.commentCellRefs.peek()).getRow() != this.rowNum) {
+ return;
+ }
+
+ this.outputEmptyCellComment((CellAddress)
this.commentCellRefs.remove());
+ }
+
+ return;
+ }
+
+ throw new IllegalStateException(
+ "Cell ref should be null only if there are only empty
cells in the row; rowNum: " +
+ this.rowNum);
+ }
+
+ CellAddress nextCommentCellRef;
+ do {
+ CellAddress cellRef = new CellAddress(this.cellRef);
+ CellAddress peekCellRef = (CellAddress)
this.commentCellRefs.peek();
+ if (type == EmptyCellCommentsCheckType.CELL &&
cellRef.equals(peekCellRef)) {
+ this.commentCellRefs.remove();
+ return;
+ }
+
+ int comparison = peekCellRef.compareTo(cellRef);
+ if (comparison > 0 && type ==
EmptyCellCommentsCheckType.END_OF_ROW &&
+ peekCellRef.getRow() <= this.rowNum) {
+ nextCommentCellRef = (CellAddress)
this.commentCellRefs.remove();
+ this.outputEmptyCellComment(nextCommentCellRef);
+ } else if (comparison < 0 && type ==
EmptyCellCommentsCheckType.CELL &&
+ peekCellRef.getRow() <= this.rowNum) {
+ nextCommentCellRef = (CellAddress)
this.commentCellRefs.remove();
+ this.outputEmptyCellComment(nextCommentCellRef);
+ } else {
+ nextCommentCellRef = null;
+ }
+ } while (nextCommentCellRef != null &&
!this.commentCellRefs.isEmpty());
+ }
+
+ }
+
+ private void outputEmptyCellComment(CellAddress cellRef) {
+ XSSFComment comment = this.comments.findCellComment(cellRef);
+ this.sheetContentsHandler.cell(cellRef.formatAsString(), (String)
null, comment);
+ }
+
+ public interface SheetContentsHandler {
+ void startRow(int var1);
+
+ void endRow(int var1);
+
+ void cell(String var1, String var2, XSSFComment var3);
+
+ default void headerFooter(String text, boolean isHeader, String
tagName) {
+ }
+
+ default void endSheet() {
+ }
+ }
+
+ private static enum EmptyCellCommentsCheckType {
+ CELL, END_OF_ROW, END_OF_SHEET_DATA;
+
+ private EmptyCellCommentsCheckType() {
+ }
+ }
+
+ static enum xssfDataType {
+ BOOLEAN, ERROR, FORMULA, INLINE_STRING, SST_STRING, NUMBER;
+
+ private xssfDataType() {
+ }
+ }
+}
+
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
index 3c1b107..d06c6fe 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
@@ -43,7 +43,6 @@ import org.apache.poi.ss.usermodel.HeaderFooter;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
-import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import
org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler;
import org.apache.poi.xssf.extractor.XSSFEventBasedExcelExtractor;
import org.apache.poi.xssf.model.Comments;
@@ -344,13 +343,13 @@ public class XSSFExcelExtractorDecorator extends
AbstractOOXMLExtractor {
}
- public void processSheet(SheetContentsHandler sheetContentsExtractor,
Comments comments,
+ public void processSheet(SheetContentsHandler sheetContentsHandler,
Comments comments,
StylesTable styles, ReadOnlySharedStringsTable
strings,
InputStream sheetInputStream) throws IOException,
SAXException {
try {
XSSFSheetInterestingPartsCapturer handler = new
XSSFSheetInterestingPartsCapturer(
- new XSSFSheetXMLHandler(styles, comments, strings,
sheetContentsExtractor,
+ new TikaXSSFSheetXMLHandler(styles, comments, strings,
sheetContentsHandler,
formatter, false));
XMLReaderUtils.parseSAX(sheetInputStream, handler, parseContext);
sheetInputStream.close();
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xslf/XSLFEventBasedPowerPointExtractor.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xslf/XSLFEventBasedPowerPointExtractor.java
index 28b9845..46ada51 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xslf/XSLFEventBasedPowerPointExtractor.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xslf/XSLFEventBasedPowerPointExtractor.java
@@ -26,13 +26,11 @@ import org.apache.poi.ooxml.POIXMLProperties;
import org.apache.poi.ooxml.extractor.POIXMLTextExtractor;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.xmlbeans.XmlException;
import
org.apache.tika.parser.microsoft.ooxml.OOXMLWordAndPowerPointTextHandler;
import org.apache.tika.parser.microsoft.ooxml.ParagraphProperties;
import org.apache.tika.parser.microsoft.ooxml.RunProperties;
-import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFEventBasedWordExtractor;
public class XSLFEventBasedPowerPointExtractor implements POIXMLTextExtractor {
@@ -40,30 +38,12 @@ public class XSLFEventBasedPowerPointExtractor implements
POIXMLTextExtractor {
private OPCPackage container;
private POIXMLProperties properties;
- public XSLFEventBasedPowerPointExtractor(String path)
- throws XmlException, OpenXML4JException, IOException {
- this(OPCPackage.open(path, PackageAccess.READ));
- }
-
public XSLFEventBasedPowerPointExtractor(OPCPackage container)
throws XmlException, OpenXML4JException, IOException {
this.container = container;
this.properties = new POIXMLProperties(container);
}
-
- public static void main(String[] args) throws Exception {
- if (args.length < 1) {
- System.err.println("Use:");
- System.err.println(" XSLFEventBasedPowerPointExtractor
<filename.pptx>");
- System.exit(1);
- }
-
- XWPFEventBasedWordExtractor extractor = new
XWPFEventBasedWordExtractor(args[0]);
- System.out.println(extractor.getText());
- extractor.close();
- }
-
public OPCPackage getPackage() {
return this.container;
}
@@ -107,6 +87,10 @@ public class XSLFEventBasedPowerPointExtractor implements
POIXMLTextExtractor {
return null;
}
+ @Override
+ public void close() throws IOException {
+ getPackage().revert();
+ }
private static class XSLFToTextContentHandler
implements
OOXMLWordAndPowerPointTextHandler.XWPFBodyContentsHandler {
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java
index 5b87599..ffc583c 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java
@@ -34,7 +34,6 @@ import org.apache.poi.ooxml.util.SAXHelper;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
@@ -66,30 +65,12 @@ public class XWPFEventBasedWordExtractor implements
POIXMLTextExtractor {
private OPCPackage container;
private POIXMLProperties properties;
- public XWPFEventBasedWordExtractor(String path)
- throws XmlException, OpenXML4JException, IOException {
- this(OPCPackage.open(path, PackageAccess.READ));
- }
-
public XWPFEventBasedWordExtractor(OPCPackage container)
throws XmlException, OpenXML4JException, IOException {
this.container = container;
this.properties = new POIXMLProperties(container);
}
-
- public static void main(String[] args) throws Exception {
- if (args.length < 1) {
- System.err.println("Use:");
- System.err.println(" XWPFEventBasedWordExtractor
<filename.xlsx>");
- System.exit(1);
- }
-
- XWPFEventBasedWordExtractor extractor = new
XWPFEventBasedWordExtractor(args[0]);
- System.out.println(extractor.getText());
- extractor.close();
- }
-
public OPCPackage getPackage() {
return this.container;
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/log4j2.xml
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/log4j2.xml
new file mode 100644
index 0000000..1e9327e
--- /dev/null
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/log4j2.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<!--
+ 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.
+-->
+<Configuration status="WARN">
+ <Appenders>
+ <Console name="Console" target="SYSTEM_ERR">
+ <PatternLayout pattern="%-5p [%t] %d{HH:mm:ss,SSS} %c %m%n"/>
+ </Console>
+ </Appenders>
+ <Loggers>
+ <Root level="info">
+ <AppenderRef ref="Console"/>
+ </Root>
+ <!-- effectively turn off the logging for POI 5.x but leave the xmlhelper
+ to warn-->
+ <Logger name="org.apache.poi.util.XMLHelper" level="INFO"
additivity="false">
+ <AppenderRef ref="Console"/>
+ </Logger>
+ <Logger name="org.apache.poi" level="ERROR" additivity="false">
+ <AppenderRef ref="Console"/>
+ </Logger>
+ </Loggers>
+</Configuration>
\ No newline at end of file