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());