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/07/13 14:21:54 UTC

(tika) branch 3x-improve-sax-ooxml created (now 6f6952a491)

This is an automated email from the ASF dual-hosted git repository.

tballison pushed a change to branch 3x-improve-sax-ooxml
in repository https://gitbox.apache.org/repos/asf/tika.git


      at 6f6952a491 small sax->ooxml improvements

This branch includes the following new commits:

     new 6f6952a491 small sax->ooxml improvements

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: small sax->ooxml improvements

Posted by ta...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tballison pushed a commit to branch 3x-improve-sax-ooxml
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 6f6952a4912a3d4ba1fa56464d059c657fb7b0d4
Author: tallison <ta...@apache.org>
AuthorDate: Mon Jul 13 10:21:41 2026 -0400

    small sax->ooxml improvements
---
 .../tika/parser/microsoft/ooxml/AbstractOOXMLExtractor.java |  6 +++++-
 .../microsoft/ooxml/SXSLFPowerPointExtractorDecorator.java  | 13 ++++++++-----
 .../parser/microsoft/ooxml/SXWPFWordExtractorDecorator.java |  4 +++-
 .../apache/tika/parser/microsoft/ooxml/XWPFListManager.java |  7 +++++++
 .../microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java   |  8 ++++++--
 .../tika/parser/microsoft/ooxml/SXSLFExtractorTest.java     |  4 +++-
 6 files changed, 32 insertions(+), 10 deletions(-)

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/AbstractOOXMLExtractor.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/AbstractOOXMLExtractor.java
index d19aaae4a1..f483b23b02 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/AbstractOOXMLExtractor.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/AbstractOOXMLExtractor.java
@@ -660,7 +660,11 @@ public abstract class AbstractOOXMLExtractor implements OOXMLExtractor {
                         parentMetadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
                                 ExceptionUtils.getStackTrace(e));
                     }
-                } catch (InvalidFormatException e) {
+                } catch (InvalidFormatException | IllegalArgumentException e) {
+                    //getRelatedPart throws an unchecked IllegalArgumentException when the
+                    //target part is missing -- common in truncated/damaged packages.  Record
+                    //it and carry on so that one unreachable part does not abandon the
+                    //remaining slides/parts.
                     parentMetadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
                             ExceptionUtils.getStackTrace(e));
                 }
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/SXSLFPowerPointExtractorDecorator.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXSLFPowerPointExtractorDecorator.java
index ee5d7050c0..10124999a1 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXSLFPowerPointExtractorDecorator.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXSLFPowerPointExtractorDecorator.java
@@ -115,7 +115,7 @@ public class SXSLFPowerPointExtractorDecorator extends AbstractOOXMLExtractor {
                 try {
                     handleSlidePart(mainDocument.getRelatedPart(slidesPRC.getRelationship(i)),
                             xhtml);
-                } catch (InvalidFormatException | ZipException e) {
+                } catch (InvalidFormatException | ZipException | IllegalArgumentException e) {
                     metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
                             ExceptionUtils.getStackTrace(e));
                 }
@@ -152,7 +152,7 @@ public class SXSLFPowerPointExtractorDecorator extends AbstractOOXMLExtractor {
             PackagePart commentAuthorsPart = null;
             try {
                 commentAuthorsPart = mainDocument.getRelatedPart(prc.getRelationship(i));
-            } catch (InvalidFormatException e) {
+            } catch (InvalidFormatException | IllegalArgumentException e) {
                 metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
                         ExceptionUtils.getStackTrace(e));
             }
@@ -250,11 +250,13 @@ public class SXSLFPowerPointExtractorDecorator extends AbstractOOXMLExtractor {
                 PackagePart slidePart = null;
                 try {
                     slidePart = mainDocument.getRelatedPart(slidePRC.getRelationship(i));
-                } catch (InvalidFormatException e) {
+                } catch (InvalidFormatException | IllegalArgumentException e) {
                     metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
                             ExceptionUtils.getStackTrace(e));
                 }
-                addSlideParts(slidePart, parts);
+                if (slidePart != null) {
+                    addSlideParts(slidePart, parts);
+                }
             }
         }
 
@@ -291,7 +293,8 @@ public class SXSLFPowerPointExtractorDecorator extends AbstractOOXMLExtractor {
 
         for (String relation : new String[]{XSLFRelation.VML_DRAWING.getRelation(),
                 XSLFRelation.SLIDE_LAYOUT.getRelation(), XSLFRelation.NOTES_MASTER.getRelation(),
-                XSLFRelation.NOTES.getRelation()}) {
+                XSLFRelation.NOTES.getRelation(), XSLFRelation.CHART.getRelation(),
+                XSLFRelation.DIAGRAM_DRAWING.getRelation()}) {
             PackageRelationshipCollection prc = null;
             try {
                 prc = slidePart.getRelationshipsByType(relation);
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/SXWPFWordExtractorDecorator.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXWPFWordExtractorDecorator.java
index 86cdb6e03e..746a4deaf1 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXWPFWordExtractorDecorator.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXWPFWordExtractorDecorator.java
@@ -70,12 +70,14 @@ import org.apache.tika.utils.XMLReaderUtils;
 public class SXWPFWordExtractorDecorator extends AbstractOOXMLExtractor {
 
 
+    //include all parts that might have embedded objects
     //include all parts that might have embedded objects
     private final static String[] MAIN_PART_RELATIONS =
             new String[]{XWPFRelation.HEADER.getRelation(), XWPFRelation.FOOTER.getRelation(),
                     XWPFRelation.FOOTNOTE.getRelation(),
                     "http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes",
-                    "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments"};
+                    "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
+                    AbstractOOXMLExtractor.RELATION_DIAGRAM_DATA};
 
     // Relationship types for Word settings
     private static final String SETTINGS_RELATION =
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/XWPFListManager.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFListManager.java
index 383c31f0f7..c7e2ec6da6 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFListManager.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFListManager.java
@@ -91,6 +91,10 @@ public class XWPFListManager extends AbstractListManager {
         if (lc == null) {
             lc = loadLevelTuples(abNum);
         }
+        if (lc == null) {
+            //the numbering.xml references an abstractNumId that isn't there
+            return "";
+        }
         if (overrideTuples == null) {
             overrideTuples = loadOverrideTuples(ctNum, lc.getNumberOfLevels());
         }
@@ -133,6 +137,9 @@ public class XWPFListManager extends AbstractListManager {
         //to get the abstract num information for the edge case where
         //someone skips a level and the format is not context-free, e.g. "1.B.i".
         XWPFAbstractNum abstractNum = numbering.getAbstractNum(abNum.getVal());
+        if (abstractNum == null) {
+            return null;
+        }
         CTAbstractNum ctAbstractNum = abstractNum.getCTAbstractNum();
 
         LevelTuple[] levels = new LevelTuple[ctAbstractNum.sizeOfLvlArray()];
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 f509d3be7c..6a72e9b5ee 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
@@ -175,7 +175,9 @@ public class XWPFEventBasedWordExtractor implements POIXMLTextExtractor {
                     handlePart(header, xwpfListManager, sb);
                 }
             }
-        } catch (InvalidFormatException e) {
+        } catch (InvalidFormatException | IllegalArgumentException e) {
+            //getRelatedPart throws an unchecked IllegalArgumentException when the target
+            //part is missing -- common in truncated/damaged packages
             LOG.warn("Invalid format", e);
         }
 
@@ -229,7 +231,9 @@ public class XWPFEventBasedWordExtractor implements POIXMLTextExtractor {
                     hyperlinks.put(id, url);
                 }
             }
-        } catch (InvalidFormatException e) {
+        } catch (InvalidFormatException | IllegalArgumentException e) {
+            //getRelatedPart throws an unchecked IllegalArgumentException when the target
+            //part is missing -- common in truncated/damaged packages
             LOG.warn("Invalid format", e);
         }
         return hyperlinks;
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/SXSLFExtractorTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/SXSLFExtractorTest.java
index a33139ad38..48de3013ee 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/SXSLFExtractorTest.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/SXSLFExtractorTest.java
@@ -62,7 +62,9 @@ public class SXSLFExtractorTest extends TikaTest {
 
         List<Metadata> metadataList = getRecursiveMetadata("testPPT_various2.pptx", parseContext);
 
-        assertEquals(14, metadataList.size(), "right number of attachments");
+        //15, not 14 -- the chart-backed workbook (Microsoft_Excel_Worksheet.xlsx) is reachable
+        //only via the CHART relation; this matches the DOM extractor's attachment set exactly
+        assertEquals(15, metadataList.size(), "right number of attachments");
 
         String mainContent = metadataList.get(0).get(TikaCoreProperties.TIKA_CONTENT);