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 <[email protected]>
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);
 

Reply via email to