You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2026/03/11 12:58:02 UTC
(tika) branch TIKA-4688-fix-truncated-ooxml created (now ca8a9eb633)
This is an automated email from the ASF dual-hosted git repository.
tallison pushed a change to branch TIKA-4688-fix-truncated-ooxml
in repository https://gitbox.apache.org/repos/asf/tika.git
at ca8a9eb633 TIKA-4688 -- fix truncated ooxml regression
This branch includes the following new commits:
new ca8a9eb633 TIKA-4688 -- fix truncated ooxml regression
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(tika) 01/01: TIKA-4688 -- fix truncated ooxml regression
Posted by ta...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
tallison pushed a commit to branch TIKA-4688-fix-truncated-ooxml
in repository https://gitbox.apache.org/repos/asf/tika.git
commit ca8a9eb633740d8a9bee2f94e6dfa86a48f548a7
Author: tallison <ta...@apache.org>
AuthorDate: Wed Mar 11 08:57:49 2026 -0400
TIKA-4688 -- fix truncated ooxml regression
---
.../parser/microsoft/ooxml/OOXMLExtractorFactory.java | 11 ++++++++++-
.../tika/parser/microsoft/ooxml/TruncatedOOXMLTest.java | 16 ++++++++++++++++
.../org/apache/tika/pipes/core/server/ParseHandler.java | 4 ++++
3 files changed, 30 insertions(+), 1 deletion(-)
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 64ca412311..8558f37c21 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
@@ -58,6 +58,7 @@ import org.apache.tika.parser.microsoft.ooxml.xps.XPSTextExtractor;
import org.apache.tika.parser.microsoft.ooxml.xslf.XSLFEventBasedPowerPointExtractor;
import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFEventBasedWordExtractor;
+
/**
* Figures out the correct {@link OOXMLExtractor} for the supplied document and
* returns it.
@@ -93,7 +94,15 @@ public class OOXMLExtractorFactory {
if (tis.getOpenContainer() instanceof OPCPackageWrapper) {
pkg = ((OPCPackageWrapper) tis.getOpenContainer()).getOPCPackage();
} else {
- pkg = OPCPackage.open(tis.getPath().toString(), PackageAccess.READ);
+ // POI 5.x can throw InvalidOperationException (a RuntimeException
+ // extending OpenXML4JRuntimeException) for truncated/corrupt zip files.
+ // The detector should have salvaged if needed, but catch broadly here
+ // as a safety net.
+ try {
+ pkg = OPCPackage.open(tis.getPath().toString(), PackageAccess.READ);
+ } catch (RuntimeException e) {
+ throw new TikaException("Error opening OOXML file", e);
+ }
tis.setOpenContainer(new OPCPackageWrapper(pkg));
}
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/TruncatedOOXMLTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/TruncatedOOXMLTest.java
index 179f3106f4..0a82cfe0df 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/TruncatedOOXMLTest.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/TruncatedOOXMLTest.java
@@ -56,6 +56,22 @@ public class TruncatedOOXMLTest extends TikaTest {
}
+ @Test
+ public void testWordTruncNoCentralDirectory() throws Exception {
+ // Truncated enough that the zip central directory is missing,
+ // but [Content_Types].xml and document.xml are intact.
+ // This exercises the ZipSalvager + OPCPackage fallback path.
+ List<Metadata> metadataList =
+ getRecursiveMetadata(truncate("testWORD_various.docx", 13500), true);
+ assertEquals(1, metadataList.size());
+ Metadata metadata = metadataList.get(0);
+ String content = metadata.get(TikaCoreProperties.TIKA_CONTENT);
+ assertEquals("application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+ metadata.get(Metadata.CONTENT_TYPE));
+ assertContains("This is the header", content);
+ assertContains("Suddenly some Japanese", content);
+ }
+
@Test
public void testTruncation() throws Exception {
diff --git a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/server/ParseHandler.java b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/server/ParseHandler.java
index 79d233ba4e..c97c1311df 100644
--- a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/server/ParseHandler.java
+++ b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/server/ParseHandler.java
@@ -44,6 +44,7 @@ import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.ParseRecord;
+import org.apache.tika.parser.ParsingIntent;
import org.apache.tika.parser.RecursiveParserWrapper;
import org.apache.tika.pipes.api.FetchEmitTuple;
import org.apache.tika.pipes.api.ParseMode;
@@ -143,6 +144,9 @@ class ParseHandler {
LOG.warn("problem digesting: " + t.getId(), e);
}
}
+ // Signal to detectors that parsing will follow, so they can prepare
+ // resources (e.g., ZipSalvager for truncated zips)
+ parseContext.set(ParsingIntent.class, ParsingIntent.WILL_PARSE);
try {
MediaType mt = detector.detect(tis, metadata, parseContext);
metadata.set(Metadata.CONTENT_TYPE, mt.toString());