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