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

tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new ae19e8b58b TIKA-4848 - parsers, step 2 (#3086)
ae19e8b58b is described below

commit ae19e8b58b21e7fd0721f1f275e90ca3a193ebdb
Author: Tim Allison <[email protected]>
AuthorDate: Thu Aug 27 21:19:06 2026 -0400

    TIKA-4848 - parsers, step 2 (#3086)
---
 .../org/apache/tika/parser/dwg/DWGReadParser.java  |  5 +--
 .../org/apache/tika/parser/crypto/TSDParser.java   |  4 +-
 .../org/apache/tika/parser/html/HtmlHandler.java   |  4 +-
 .../java/org/apache/tika/parser/image/HeifXmp.java |  2 +-
 .../org/apache/tika/parser/image/ImageXmp.java     |  8 ++--
 .../apache/tika/parser/image/RawTiffParser.java    |  2 +-
 .../parser/microsoft/AbstractPOIFSExtractor.java   |  8 ++--
 .../tika/parser/microsoft/HSLFExtractor.java       | 18 ++++----
 .../tika/parser/microsoft/JackcessExtractor.java   |  8 ++--
 .../apache/tika/parser/microsoft/OfficeParser.java |  2 +-
 .../microsoft/onenote/OneNoteTreeWalker.java       |  2 +-
 .../onenote/fsshttpb/MSOneStorePackage.java        |  2 +-
 .../microsoft/ooxml/AbstractOOXMLExtractor.java    | 22 ++++------
 .../ooxml/SXSLFPowerPointExtractorDecorator.java   | 48 ++++++++--------------
 .../ooxml/SXWPFWordExtractorDecorator.java         | 27 ++++--------
 .../ooxml/XSSFExcelExtractorDecorator.java         | 26 ++++--------
 .../microsoft/ooxml/xps/XPSExtractorDecorator.java |  2 +-
 .../parser/microsoft/pst/PSTMailItemParser.java    |  4 +-
 .../parser/microsoft/rtf/RTFEmbObjHandler.java     |  8 ++--
 .../parser/microsoft/rtf/RTFObjDataParser.java     |  9 ++--
 .../tika/parser/microsoft/rtf/RTFParser.java       |  2 +-
 .../tika/parser/microsoft/rtf/TextExtractor.java   | 11 +++--
 .../microsoft/rtf/jflex/RTFEmbeddedHandler.java    |  6 +--
 .../tika/parser/microsoft/xml/WordMLParser.java    |  2 +-
 .../org/apache/tika/parser/epub/EpubParser.java    |  2 +-
 .../tika/parser/geogebra/GeoGebraParser.java       | 10 ++---
 .../apache/tika/parser/indesign/IDMLParser.java    |  2 +-
 .../apache/tika/parser/pdf/AbstractPDF2XHTML.java  | 16 ++++----
 .../java/org/apache/tika/parser/pdf/PDFParser.java |  4 +-
 .../tika/parser/pdf/PDMetadataExtractor.java       |  4 +-
 .../tika/parser/pdf/image/ImageGraphicsEngine.java |  4 +-
 .../tika/renderer/pdf/pdfbox/PDFBoxRenderer.java   |  2 +-
 .../org/apache/tika/parser/pkg/PackageParser.java  |  2 +-
 .../java/org/apache/tika/parser/pkg/ZipParser.java | 16 ++++----
 .../tika/parser/markdown/MarkdownParser.java       |  2 +-
 .../org/apache/tika/parser/warc/WARCParser.java    |  4 +-
 36 files changed, 133 insertions(+), 167 deletions(-)

diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGReadParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGReadParser.java
index 1c98d6ee7b..ec048699a1 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGReadParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGReadParser.java
@@ -60,7 +60,6 @@ import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.EmbeddedContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
-import org.apache.tika.utils.ExceptionUtils;
 import org.apache.tika.utils.FileProcessResult;
 import org.apache.tika.utils.ProcessUtils;
 
@@ -189,9 +188,9 @@ public class DWGReadParser extends AbstractDWGParser {
             try {
                 jParser = jfactory.createParser(tmpFileOut);
             } catch (JsonParseException e1) {
-                throw new TikaException("Failed to parse Json: " + 
ExceptionUtils.getStackTrace(e1));
+                throw new TikaException("Failed to parse Json", e1);
             } catch (IOException e1) {
-                throw new TikaException("Failed to read json file: " + 
ExceptionUtils.getStackTrace(e1));
+                throw new TikaException("Failed to read json file", e1);
             }
             // read json token in a stream using jackson, iterate over each 
token. We only
             // support OBJECTS, FILEHEADER and SummaryInfo
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/TSDParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/TSDParser.java
index 7074248947..5cd59c7176 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/TSDParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/TSDParser.java
@@ -67,6 +67,7 @@ import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.sax.XHTMLContentHandler;
+import org.apache.tika.utils.ExceptionUtils;
 
 /**
  * Tika parser for Time Stamped Data Envelope (application/timestamped-data)
@@ -189,8 +190,7 @@ public class TSDParser implements Parser {
                     }
                 } catch (IOException e) {
                     // Truncated file - record exception and work with what we 
got
-                    metadata.set(TikaCoreProperties.EMBEDDED_EXCEPTION,
-                            e.getClass().getName() + ": " + e.getMessage());
+                    metadata.set(TikaCoreProperties.EMBEDDED_EXCEPTION, 
ExceptionUtils.format(e, context));
                     LOG.debug("Error reading TSD content (possibly 
truncated)", e);
                 }
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/HtmlHandler.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/HtmlHandler.java
index 5fa33a5d59..759ea69984 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/HtmlHandler.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/HtmlHandler.java
@@ -349,7 +349,7 @@ class HtmlHandler extends TextContentHandler {
             try (TikaInputStream tis = 
TikaInputStream.get(string.getBytes(StandardCharsets.UTF_8))) {
                 embeddedDocumentExtractor.parseEmbedded(tis, xhtml, m, 
context, true);
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
             }
         }
     }
@@ -376,7 +376,7 @@ class HtmlHandler extends TextContentHandler {
             try (TikaInputStream tis = 
TikaInputStream.get(dataURIScheme.getInputStream())) {
                 embeddedDocumentExtractor.parseEmbedded(tis, xhtml, m, 
context, true);
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
             }
         }
     }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/HeifXmp.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/HeifXmp.java
index 3461b41265..a2bf1b2f86 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/HeifXmp.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/HeifXmp.java
@@ -68,7 +68,7 @@ final class HeifXmp {
         } catch (SecurityException e) {
             throw e;
         } catch (IOException | SAXException | TikaException | RuntimeException 
e) {
-            EmbeddedDocumentUtil.recordException(e, metadata);   // bad XMP 
must not fail the parse
+            EmbeddedDocumentUtil.recordException(e, metadata, context);   // 
bad XMP must not fail the parse
         }
         return true;
     }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/ImageXmp.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/ImageXmp.java
index 8f540148de..c624f89a94 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/ImageXmp.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/ImageXmp.java
@@ -64,7 +64,7 @@ final class ImageXmp {
         } catch (SecurityException e) {
             throw e;
         } catch (IOException | SAXException | TikaException | RuntimeException 
e) {
-            EmbeddedDocumentUtil.recordException(e, metadata);
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         }
         return false;
     }
@@ -76,7 +76,7 @@ final class ImageXmp {
         } catch (SecurityException e) {
             throw e;
         } catch (IOException | SAXException | TikaException | RuntimeException 
e) {
-            EmbeddedDocumentUtil.recordException(e, metadata);
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         }
     }
 
@@ -100,7 +100,7 @@ final class ImageXmp {
         } catch (SecurityException e) {
             throw e;
         } catch (IOException | SAXException | TikaException | RuntimeException 
e) {
-            EmbeddedDocumentUtil.recordException(e, metadata);
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         }
     }
 
@@ -114,7 +114,7 @@ final class ImageXmp {
         } catch (SecurityException e) {
             throw e;
         } catch (IOException | SAXException | TikaException | RuntimeException 
e) {
-            EmbeddedDocumentUtil.recordException(e, metadata);
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         }
     }
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/RawTiffParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/RawTiffParser.java
index a2176519a8..d4a3cb8d07 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/RawTiffParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/RawTiffParser.java
@@ -166,7 +166,7 @@ public class RawTiffParser extends TiffParser {
         } catch (TiffStructureException | IOException e) {
             //a file we cannot walk for previews should not fail the parse;
             //the TIFF metadata has already been extracted at this point
-            EmbeddedDocumentUtil.recordException(e, metadata);
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
             return;
         }
         if (previews.isEmpty()) {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/AbstractPOIFSExtractor.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/AbstractPOIFSExtractor.java
index 3f6496e08d..28dbffa236 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/AbstractPOIFSExtractor.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/AbstractPOIFSExtractor.java
@@ -182,7 +182,7 @@ abstract class AbstractPOIFSExtractor {
                     throw e;
                 } catch (Exception e) {
                     //if there's a stream error while detecting, give up
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
                     return;
                 }
                 handleEmbeddedResource(tis, metadata,null, dir.getName(), 
dir.getStorageClsid(),
@@ -295,7 +295,7 @@ abstract class AbstractPOIFSExtractor {
         try {
             contentsEntry = (DocumentEntry) 
parentDir.getEntry(contentsEntryName);
         } catch (FileNotFoundException fnfe) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(fnfe, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(fnfe, 
parentMetadata, context);
             return;
         }
 
@@ -306,7 +306,7 @@ abstract class AbstractPOIFSExtractor {
         } catch (SecurityException e) {
             throw e;
         } catch (Exception e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
             return;
         }
         try (TikaInputStream tis = TikaInputStream.get(inp)) {
@@ -378,7 +378,7 @@ abstract class AbstractPOIFSExtractor {
         } catch (SecurityException e) {
             throw e;
         } catch (Exception e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
             return;
         }
         if (data == null) {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/HSLFExtractor.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/HSLFExtractor.java
index dca24644dd..af7bf9cd14 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/HSLFExtractor.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/HSLFExtractor.java
@@ -268,7 +268,7 @@ public class HSLFExtractor extends AbstractPOIFSExtractor {
                     }
                 }
             } catch (IOException | TikaException e) {
-                EmbeddedDocumentUtil.recordException(e, parentMetadata);
+                EmbeddedDocumentUtil.recordException(e, parentMetadata, 
context);
             }
             i++;
         }
@@ -428,10 +428,10 @@ public class HSLFExtractor extends AbstractPOIFSExtractor 
{
                         OfficeParser.extractMacros(poifsFileSystem, xhtml,
                                 
EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(context), context);
                     } catch (IOException | SAXException | TikaException inner) 
{
-                        EmbeddedDocumentUtil.recordException(inner, 
parentMetadata);
+                        EmbeddedDocumentUtil.recordException(inner, 
parentMetadata, context);
                     }
                 } catch (IOException e) {
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);//swallow
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);//swallow
                 }
             }
         }
@@ -586,7 +586,7 @@ public class HSLFExtractor extends AbstractPOIFSExtractor {
             } catch (SecurityException e) {
                 throw e;
             } catch (Exception e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
                 continue;
             }
             try (TikaInputStream picIs = TikaInputStream.get(data)) {
@@ -619,7 +619,7 @@ public class HSLFExtractor extends AbstractPOIFSExtractor {
                     pd = ((HSLFPictureShape) shape).getPictureData();
                 } catch (IndexOutOfBoundsException e) {
                     // corrupt Escher BSE record -- skip page anchoring for 
this shape
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
                     continue;
                 }
                 if (pd != null) {
@@ -648,7 +648,7 @@ public class HSLFExtractor extends AbstractPOIFSExtractor {
                     data = oleShape.getObjectData();
                 } catch (NullPointerException e) {
                     /* getObjectData throws NPE some times. */
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
                     continue;
                 }
 
@@ -668,7 +668,7 @@ public class HSLFExtractor extends AbstractPOIFSExtractor {
                     try {
                         dataStream = data.getInputStream();
                     } catch (Exception e) {
-                        EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                        EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
                         continue;
                     }
                     handleDataStream(dataStream, objID, oleShape.getProgId(), 
xhtml);
@@ -703,7 +703,7 @@ public class HSLFExtractor extends AbstractPOIFSExtractor {
         } catch (SecurityException e) {
             throw e;
         } catch (Exception e) {
-            EmbeddedDocumentUtil.recordException(e, parentMetadata);
+            EmbeddedDocumentUtil.recordException(e, parentMetadata, context);
         }
     }
 
@@ -714,7 +714,7 @@ public class HSLFExtractor extends AbstractPOIFSExtractor {
         } catch (NullPointerException e) {
             // Sometimes HSLF hits problems
             // Please open POI bugs for any you come across!
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
             return null;
         }
     }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessExtractor.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessExtractor.java
index ef284debe1..6063ec1450 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessExtractor.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessExtractor.java
@@ -327,7 +327,7 @@ class JackcessExtractor extends AbstractPOIFSExtractor {
                 try {
                     tis = TikaInputStream.get(spc.getStream());
                 } catch (IOException e) {
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, parseContext);
                     break;
                 }
                 if (tis != null) {
@@ -347,7 +347,7 @@ class JackcessExtractor extends AbstractPOIFSExtractor {
                 try {
                     ocStream = TikaInputStream.get(oc.getStream());
                 } catch (IOException e) {
-                    EmbeddedDocumentUtil.recordException(e, parentMetadata);
+                    EmbeddedDocumentUtil.recordException(e, parentMetadata, 
parseContext);
                 }
                 try {
                     handleEmbeddedResource(ocStream, null,//filename
@@ -373,14 +373,14 @@ class JackcessExtractor extends AbstractPOIFSExtractor {
             try {
                 is = cc.getStream();
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, parseContext);
                 return;
             }
 
             try {
                 fileSystem = new POIFSFileSystem(is);
             } catch (Exception e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, parseContext);
                 return;
             }
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
index efa9c61ffb..a88bf609a4 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
@@ -128,7 +128,7 @@ public class OfficeParser extends AbstractOfficeParser {
             m.set(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE,
                     TikaCoreProperties.EmbeddedResourceType.MACRO.toString());
             m.set(HttpHeaders.CONTENT_TYPE, "text/x-vbasic");
-            EmbeddedDocumentUtil.recordException(e, m);
+            EmbeddedDocumentUtil.recordException(e, m, context);
             if (embeddedDocumentExtractor.shouldParseEmbedded(m, context)) {
                 embeddedDocumentExtractor.parseEmbedded(
                         //pass in space character so that we don't trigger a 
zero-byte exception
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteTreeWalker.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteTreeWalker.java
index 943520e37f..a4c3902c0c 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteTreeWalker.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteTreeWalker.java
@@ -429,7 +429,7 @@ class OneNoteTreeWalker {
             dif.read(buf);
         } catch (IOException e) {
             //store this exception in the parent's metadata
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, parseContext);
             return;
         }
         Metadata embeddedMetadata = Metadata.newInstance(this.parseContext);
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/fsshttpb/MSOneStorePackage.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/fsshttpb/MSOneStorePackage.java
index 0ad1d277dd..ca1a724ee1 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/fsshttpb/MSOneStorePackage.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/fsshttpb/MSOneStorePackage.java
@@ -1007,7 +1007,7 @@ public class MSOneStorePackage {
                         embeddedMetadata, this.parseContext, false);
             }
         } catch (IOException e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, parseContext);
         }
     }
 
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 fd3202bb07..6c16bca535 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
@@ -240,7 +240,7 @@ public abstract class AbstractOOXMLExtractor implements 
OOXMLExtractor {
             WriteLimitReachedException.throwIfWriteLimitReached(ex);
             //swallow otherwise
             metadata.add(TikaCoreProperties.EMBEDDED_EXCEPTION,
-                    ExceptionUtils.getStackTrace(ex));
+                    ExceptionUtils.format(ex, context));
         }
     }
 
@@ -265,7 +265,7 @@ public abstract class AbstractOOXMLExtractor implements 
OOXMLExtractor {
                     } catch (SAXException | SecurityException e) {
                         throw e;
                     } catch (Exception e) {
-                        EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                        EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
                     }
                 }
             }
@@ -378,7 +378,7 @@ public abstract class AbstractOOXMLExtractor implements 
OOXMLExtractor {
         try {
             fs = new POIFSFileSystem(part.getInputStream());
         } catch (Exception e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
             return;
         }
         TikaInputStream tis = null;
@@ -438,7 +438,7 @@ public abstract class AbstractOOXMLExtractor implements 
OOXMLExtractor {
         } catch (Ole10NativeException e) {
             // Could not process an OLE 1.0 entry, so skip this part
         } catch (IOException e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
         } finally {
             fs.close();
             if (tis != null) {
@@ -641,7 +641,7 @@ public abstract class AbstractOOXMLExtractor implements 
OOXMLExtractor {
             }
 
         } catch (InvalidFormatException e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata, 
context);
         }
         return linkedRelationships;
     }
@@ -685,8 +685,7 @@ public abstract class AbstractOOXMLExtractor implements 
OOXMLExtractor {
         try {
             relatedPartPRC = parentPart.getRelationshipsByType(contentType);
         } catch (InvalidFormatException e) {
-            parentMetadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, parentMetadata, context);
         }
         if (relatedPartPRC != null && relatedPartPRC.size() > 0) {
             AttributesImpl attributes = new AttributesImpl();
@@ -715,17 +714,14 @@ public abstract class AbstractOOXMLExtractor implements 
OOXMLExtractor {
 
                     } catch (IOException | TikaException e) {
                         balancer.drainOpenElements();
-                        
parentMetadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                                ExceptionUtils.getStackTrace(e));
+                        EmbeddedDocumentUtil.recordException(e, 
parentMetadata, context);
                     } catch (SAXException e) {
                         balancer.drainOpenElements();
                         WriteLimitReachedException.throwIfWriteLimitReached(e);
-                        
parentMetadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                                ExceptionUtils.getStackTrace(e));
+                        EmbeddedDocumentUtil.recordException(e, 
parentMetadata, context);
                     }
                 } catch (InvalidFormatException e) {
-                    
parentMetadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                            ExceptionUtils.getStackTrace(e));
+                    EmbeddedDocumentUtil.recordException(e, parentMetadata, 
context);
                 }
             }
             contentHandler.endElement("", "div", "div");
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 9ffda5fd03..6eed018678 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
@@ -39,15 +39,14 @@ import org.xml.sax.SAXException;
 
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.exception.WriteLimitReachedException;
+import org.apache.tika.extractor.EmbeddedDocumentUtil;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Office;
 import org.apache.tika.metadata.PageAnchoring;
-import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import 
org.apache.tika.parser.microsoft.ooxml.xslf.XSLFEventBasedPowerPointExtractor;
 import org.apache.tika.sax.EmbeddedContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
-import org.apache.tika.utils.ExceptionUtils;
 import org.apache.tika.utils.XMLReaderUtils;
 
 /**
@@ -112,8 +111,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
         try {
             slidesPRC = 
mainDocument.getRelationshipsByType(XSLFRelation.SLIDE.getRelation());
         } catch (InvalidFormatException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         }
 
         int hiddenSlideCount = 0;
@@ -127,8 +125,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
                     }
                     hiddenSlideCount += handleSlidePart(slidePart, xhtml);
                 } catch (InvalidFormatException | ZipException e) {
-                    
metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                            ExceptionUtils.getStackTrace(e));
+                    EmbeddedDocumentUtil.recordException(e, metadata, context);
                 }
             }
         }
@@ -155,8 +152,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
         try {
             prc = 
mainDocument.getRelationshipsByType(XSLFRelation.COMMENT_AUTHORS.getRelation());
         } catch (InvalidFormatException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         }
         if (prc == null || prc.size() == 0) {
             return;
@@ -167,8 +163,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
             try {
                 commentAuthorsPart = safeGetRelatedPart(mainDocument, 
prc.getRelationship(i));
             } catch (InvalidFormatException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
             if (commentAuthorsPart == null) {
                 continue;
@@ -178,8 +173,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
                         new XSLFCommentAuthorHandler(commentAuthors), context);
 
             } catch (TikaException | SAXException | IOException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
         }
 
@@ -222,12 +216,10 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
             // </div> below so subsequent slides -- and the outer </body> --
             // land in a balanced spot.
             WriteLimitReachedException.throwIfWriteLimitReached(e);
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
             bodyHandler.closeAnyPending();
         } catch (TikaException | IOException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
             bodyHandler.closeAnyPending();
         }
 
@@ -279,8 +271,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
         try {
             slidePRC = 
mainDocument.getRelationshipsByType(XSLFRelation.SLIDE.getRelation());
         } catch (InvalidFormatException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
 
         }
         if (slidePRC != null) {
@@ -289,8 +280,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
                 try {
                     slidePart = safeGetRelatedPart(mainDocument, 
slidePRC.getRelationship(i));
                 } catch (InvalidFormatException e) {
-                    
metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                            ExceptionUtils.getStackTrace(e));
+                    EmbeddedDocumentUtil.recordException(e, metadata, context);
                 }
                 recordPicturePageRefs(slidePart, i + 1);
                 addSlideParts(slidePart, parts);
@@ -304,8 +294,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
             try {
                 prc = mainDocument.getRelationshipsByType(rel);
             } catch (InvalidFormatException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
             if (prc != null) {
                 for (int i = 0; i < prc.size(); i++) {
@@ -313,8 +302,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
                     try {
                         pp = safeGetRelatedPart(mainDocument, 
prc.getRelationship(i));
                     } catch (InvalidFormatException e) {
-                        
metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                                ExceptionUtils.getStackTrace(e));
+                        EmbeddedDocumentUtil.recordException(e, metadata, 
context);
                     }
                     if (pp != null) {
                         parts.add(pp);
@@ -346,8 +334,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
         try {
             prc = 
slidePart.getRelationshipsByType(PackageRelationshipTypes.IMAGE_PART);
         } catch (InvalidFormatException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
             return;
         }
         if (prc == null) {
@@ -361,8 +348,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
             try {
                 imagePart = slidePart.getRelatedPart(rel);
             } catch (InvalidFormatException | IllegalArgumentException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
                 continue;
             }
             if (imagePart == null) {
@@ -394,8 +380,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
             try {
                 prc = slidePart.getRelationshipsByType(relation);
             } catch (InvalidFormatException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
             if (prc != null) {
                 for (PackageRelationship packageRelationship : prc) {
@@ -405,8 +390,7 @@ public class SXSLFPowerPointExtractorDecorator extends 
AbstractOOXMLExtractor {
                             relName = PackagingURIHelper
                                     
.createPartName(packageRelationship.getTargetURI());
                         } catch (InvalidFormatException e) {
-                            
metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                                    ExceptionUtils.getStackTrace(e));
+                            EmbeddedDocumentUtil.recordException(e, metadata, 
context);
                         }
                         if (relName != null) {
                             
parts.add(packageRelationship.getPackage().getPart(relName));
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 9da2352c19..5d1c7f122b 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
@@ -39,10 +39,10 @@ import org.xml.sax.helpers.DefaultHandler;
 
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.exception.WriteLimitReachedException;
+import org.apache.tika.extractor.EmbeddedDocumentUtil;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Office;
-import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.microsoft.EMFParser;
 import org.apache.tika.parser.microsoft.OfficeParserConfig;
@@ -52,7 +52,6 @@ import 
org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFNumberingShim;
 import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFStylesShim;
 import org.apache.tika.sax.EmbeddedContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
-import org.apache.tika.utils.ExceptionUtils;
 import org.apache.tika.utils.XMLReaderUtils;
 
 /**
@@ -254,8 +253,7 @@ public class SXWPFWordExtractorDecorator extends 
AbstractOOXMLExtractor {
         } catch (SecurityException e) {
             throw e;
         } catch (Exception e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         }
 
         if (config.isIncludeHeadersAndFooters()) {
@@ -278,8 +276,7 @@ public class SXWPFWordExtractorDecorator extends 
AbstractOOXMLExtractor {
                     }
                 }
             } catch (InvalidFormatException | ZipException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
         }
 
@@ -294,8 +291,7 @@ public class SXWPFWordExtractorDecorator extends 
AbstractOOXMLExtractor {
                     handlePart(documentPart, styles, listManager, xhtml, 
inlinePartMap);
             emittedCommentIds = mainBodyHandler.getEmittedCommentIds();
         } catch (ZipException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         }
         //dump remaining components at end (diagrams, charts, footers)
         for (String rel : new 
String[]{AbstractOOXMLExtractor.RELATION_DIAGRAM_DATA,
@@ -320,8 +316,7 @@ public class SXWPFWordExtractorDecorator extends 
AbstractOOXMLExtractor {
                     }
                 }
             } catch (InvalidFormatException | ZipException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
         }
         //dump any comments that were NOT inlined via commentReference
@@ -353,8 +348,7 @@ public class SXWPFWordExtractorDecorator extends 
AbstractOOXMLExtractor {
                         context);
                 xhtml.endElement("div");
             } catch (TikaException | IOException | SAXException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
         }
     }
@@ -379,16 +373,14 @@ public class SXWPFWordExtractorDecorator extends 
AbstractOOXMLExtractor {
                             config.isPreferAlternateContentChoice())), 
context);
         } catch (SAXException e) {
             WriteLimitReachedException.throwIfWriteLimitReached(e);
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
             // The partial parse may have left <p>, <td>, <tr>, <table>, or
             // formatting tags open on the XHTML stream. Close them now so
             // subsequent parts -- and the outer </body></html> -- land in a
             // balanced spot.
             bodyHandler.closeAnyPending();
         } catch (TikaException | IOException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
             bodyHandler.closeAnyPending();
         }
         Map<String, EmbeddedPartMetadata> partMetadata = 
bodyHandler.getEmbeddedPartMetadataMap();
@@ -480,8 +472,7 @@ public class SXWPFWordExtractorDecorator extends 
AbstractOOXMLExtractor {
             }
             return collector.getContentMap();
         } catch (InvalidFormatException | IOException | TikaException | 
SAXException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
             return Collections.emptyMap();
         }
     }
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/XSSFExcelExtractorDecorator.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
index 111b94b578..14647d566e 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/XSSFExcelExtractorDecorator.java
@@ -54,6 +54,7 @@ import org.xml.sax.helpers.DefaultHandler;
 import org.apache.tika.exception.RuntimeSAXException;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.exception.WriteLimitReachedException;
+import org.apache.tika.extractor.EmbeddedDocumentUtil;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Office;
 import org.apache.tika.metadata.PageAnchoring;
@@ -62,7 +63,6 @@ import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.microsoft.OfficeParserConfig;
 import org.apache.tika.parser.microsoft.TikaExcelDataFormatter;
 import org.apache.tika.sax.XHTMLContentHandler;
-import org.apache.tika.utils.ExceptionUtils;
 import org.apache.tika.utils.StringUtils;
 import org.apache.tika.utils.XMLReaderUtils;
 
@@ -174,15 +174,13 @@ public class XSSFExcelExtractorDecorator extends 
AbstractOOXMLExtractor {
         try {
             stylesShim = new XSSFStylesShim(xssfReader.getStylesData(), 
parseContext);
         } catch (Exception e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, parseContext);
         }
         try {
             stringsShim = new 
XSSFSharedStringsShim(xssfReader.getSharedStringsData(),
                     config.isConcatenatePhoneticRuns(), parseContext);
         } catch (Exception e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, parseContext);
         }
         while (true) {
             try {
@@ -190,8 +188,7 @@ public class XSSFExcelExtractorDecorator extends 
AbstractOOXMLExtractor {
                     break;
                 }
             } catch (RuntimeException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, 
parseContext);
                 break;
             }
             SheetTextAsHTML sheetExtractor = new SheetTextAsHTML(config, 
xhtml);
@@ -204,8 +201,7 @@ public class XSSFExcelExtractorDecorator extends 
AbstractOOXMLExtractor {
                 // truncated workbook references a sheet that isn't in the 
zip).
                 // Break rather than continue — POI's iterator state may not 
have
                 // advanced, which would cause an infinite loop.
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, 
parseContext);
                 break;
             }
             try (InputStream stream = nextStream) {
@@ -233,8 +229,7 @@ public class XSSFExcelExtractorDecorator extends 
AbstractOOXMLExtractor {
                     // Truncated/malformed sheet XML — keep prior sheets and
                     // record the failure as a warning.
                     WriteLimitReachedException.throwIfWriteLimitReached(e);
-                    
metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                            ExceptionUtils.getStackTrace(e));
+                    EmbeddedDocumentUtil.recordException(e, metadata, 
parseContext);
                     // Balance any <tr>/<td> left open by the partial parse so
                     // the </tbody></table></div> emitted below land in the
                     // right place.
@@ -243,8 +238,7 @@ public class XSSFExcelExtractorDecorator extends 
AbstractOOXMLExtractor {
                     // Truncated stream — same risk: partial <tr>/<td> still
                     // open. Close them so the surrounding </tbody></table>
                     // stays balanced, record the failure, and keep going.
-                    
metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                            ExceptionUtils.getStackTrace(e));
+                    EmbeddedDocumentUtil.recordException(e, metadata, 
parseContext);
                     sheetExtractor.closeAnyPending();
                 }
                 try {
@@ -1339,8 +1333,7 @@ public class XSSFExcelExtractorDecorator extends 
AbstractOOXMLExtractor {
         try {
             prc = 
drawingPart.getRelationshipsByType(PackageRelationshipTypes.IMAGE_PART);
         } catch (InvalidFormatException e) {
-            metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordException(e, metadata, parseContext);
             return;
         }
         if (prc == null) {
@@ -1354,8 +1347,7 @@ public class XSSFExcelExtractorDecorator extends 
AbstractOOXMLExtractor {
             try {
                 imagePart = drawingPart.getRelatedPart(rel);
             } catch (InvalidFormatException | IllegalArgumentException e) {
-                metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING,
-                        ExceptionUtils.getStackTrace(e));
+                EmbeddedDocumentUtil.recordException(e, metadata, 
parseContext);
                 continue;
             }
             if (imagePart == null) {
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/xps/XPSExtractorDecorator.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSExtractorDecorator.java
index 0dbf6f9322..308aa0cdd4 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSExtractorDecorator.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSExtractorDecorator.java
@@ -130,7 +130,7 @@ public class XPSExtractorDecorator extends 
AbstractOOXMLExtractor {
             tis = getZipStream(zipPath, pkg);
         } catch (IOException | TikaException e) {
             //store this exception in the parent's metadata
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata, 
context);
             return;
         }
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
index 816d25c82e..509000babb 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
@@ -222,7 +222,7 @@ public class PSTMailItemParser implements Parser {
                 PSTAttachment attachment = email.getAttachment(i);
                 parseMailAttachment(xhtml, attachment, metadata, 
embeddedExtractor, context);
             } catch (Exception e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
             }
         }
     }
@@ -268,7 +268,7 @@ public class PSTMailItemParser implements Parser {
             try {
                 tis = TikaInputStream.get(attachment.getFileInputStream());
             } catch (NullPointerException e) { //TIKA-2488
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
                 return;
             }
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFEmbObjHandler.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFEmbObjHandler.java
index 8e38f13aca..6ef392ec69 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFEmbObjHandler.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFEmbObjHandler.java
@@ -186,12 +186,12 @@ class RTFEmbObjHandler {
 
         byte[] bytes = os.toByteArray();
         if (state == EMB_STATE.OBJDATA) {
-            RTFObjDataParser objParser = new RTFObjDataParser(memoryLimitInKb);
+            RTFObjDataParser objParser = new RTFObjDataParser(memoryLimitInKb, 
context);
             try {
                 byte[] objBytes = objParser.parse(bytes, metadata, 
unknownFilenameCount);
                 extractObj(objBytes, handler, metadata);
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordException(e, metadata);
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
         } else if (state == EMB_STATE.PICT) {
             String filePath = metadata.get(RTFMetadata.RTF_PICT_META_PREFIX + 
"wzDescription");
@@ -253,10 +253,10 @@ class RTFEmbObjHandler {
                                     context, true);
                 } catch (IOException e) {
                     balancer.drainOpenElements();
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
                 } catch (SAXException e) {
                     balancer.drainOpenElements();
-                    EmbeddedDocumentUtil.recordException(e, metadata);
+                    EmbeddedDocumentUtil.recordException(e, metadata, context);
                 }
             }
         }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFObjDataParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFObjDataParser.java
index 695ecfd3ba..737829be1d 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFObjDataParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFObjDataParser.java
@@ -45,6 +45,7 @@ import org.apache.tika.metadata.HttpHeaders;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.RTFMetadata;
 import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.microsoft.OfficeParser.POIFSDocumentType;
 
 /**
@@ -56,9 +57,11 @@ class RTFObjDataParser {
 
     private final static String WIN_ASCII = "WINDOWS-1252";
     private final int memoryLimitInKb;
+    private final ParseContext context;
 
-    RTFObjDataParser(int memoryLimitInKb) {
+    RTFObjDataParser(int memoryLimitInKb, ParseContext context) {
         this.memoryLimitInKb = memoryLimitInKb;
+        this.context = context;
     }
 
     /**
@@ -123,14 +126,14 @@ class RTFObjDataParser {
             try {
                 hasPoifs = hasPOIFSHeader(embIs);
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
                 return embObjBytes;
             }
             if (hasPoifs) {
                 try {
                     return handleEmbeddedPOIFS(embIs, metadata, 
unknownFilenameCount);
                 } catch (Exception e) {
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
                 }
             }
         }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java
index 3d0274b998..bc52cc74e0 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java
@@ -132,7 +132,7 @@ public class RTFParser implements Parser {
             throws TikaException, IOException, SAXException {
         RTFEmbObjHandler embObjHandler =
                 new RTFEmbObjHandler(handler, metadata, context, 
getMemoryLimitInKb());
-        final TextExtractor ert = new TextExtractor(handler, metadata, 
embObjHandler);
+        final TextExtractor ert = new TextExtractor(handler, metadata, 
embObjHandler, context);
         ert.setIgnoreListMarkup(ignoreListMarkup);
         ert.extract(is);
     }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/TextExtractor.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/TextExtractor.java
index 0e7252423e..9d8ac8c6d1 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/TextExtractor.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/TextExtractor.java
@@ -51,6 +51,7 @@ import org.apache.tika.metadata.OfficeOpenXMLExtended;
 import org.apache.tika.metadata.Property;
 import org.apache.tika.metadata.RTFMetadata;
 import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
 import org.apache.tika.utils.CharsetUtils;
 
 /* Tokenizes and performs a "shallow" parse of the RTF
@@ -338,10 +339,12 @@ final class TextExtractor {
     //this is an arbitrary limit on the size of the stack
     //to defend against DoS with memory consumption
     private int maxStackSize = 1000;
+    private final ParseContext context;
 
     public TextExtractor(ContentHandler out, Metadata metadata,
-                         RTFEmbObjHandler embObjHandler) {
+                         RTFEmbObjHandler embObjHandler, ParseContext context) 
{
         this.metadata = metadata;
+        this.context = context;
         this.out = out;
         this.embObjHandler = embObjHandler;
     }
@@ -1033,7 +1036,7 @@ final class TextExtractor {
                     try {
                         embObjHandler.writeBytes(in, param);
                     } catch (IOException | TikaException e) {
-                        EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                        EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
                         embObjHandler.reset();
                     }
                 } else {
@@ -1500,7 +1503,7 @@ final class TextExtractor {
             try {
                 embObjHandler.handleCompletedObject();
             } catch (TikaException | IOException e) {
-                EmbeddedDocumentUtil.recordException(e, metadata);
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             } catch (SecurityException e) {
                 // Security-relevant exceptions must always propagate
                 // immediately -- never swallow them as a warning.
@@ -1510,7 +1513,7 @@ final class TextExtractor {
                 // EmptyFileException; other malformed embedded payloads
                 // can surface as a variety of runtime exceptions. Record
                 // and continue rather than aborting the outer RTF parse.
-                EmbeddedDocumentUtil.recordException(e, metadata);
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             }
             groupState.objdata = false;
         } else if (groupState.pictDepth > 0) {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/jflex/RTFEmbeddedHandler.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/jflex/RTFEmbeddedHandler.java
index 6fee08d1d7..9889a4d245 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/jflex/RTFEmbeddedHandler.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/jflex/RTFEmbeddedHandler.java
@@ -151,7 +151,7 @@ public class RTFEmbeddedHandler {
                 extractObj(tis, metadata);
             }
         } catch (IOException e) {
-            EmbeddedDocumentUtil.recordException(e, metadata);
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         } finally {
             objParser.close();
             objParser = null;
@@ -180,7 +180,7 @@ public class RTFEmbeddedHandler {
                 }
             }
         } catch (IOException e) {
-            EmbeddedDocumentUtil.recordException(e, metadata);
+            EmbeddedDocumentUtil.recordException(e, metadata, context);
         } finally {
             pictParser = null;
             reset();
@@ -227,7 +227,7 @@ public class RTFEmbeddedHandler {
                 embeddedDocumentExtractor.parseEmbedded(
                         tis, new EmbeddedContentHandler(handler), meta, 
context, true);
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, meta);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, meta, 
context);
             }
         }
     }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/xml/WordMLParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/xml/WordMLParser.java
index c9da05b430..3aa274ebb7 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/xml/WordMLParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/xml/WordMLParser.java
@@ -282,7 +282,7 @@ public class WordMLParser extends AbstractXML2003Parser {
                     rawBytes = base64.decode(buffer.toString());
                     success = true;
                 } catch (IllegalArgumentException e) {
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, parseContext);
                 } finally {
                     //reset
                     buffer.setLength(0);
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/epub/EpubParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/epub/EpubParser.java
index bc525b6aff..00c3e79c8b 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/epub/EpubParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/epub/EpubParser.java
@@ -451,7 +451,7 @@ public class EpubParser implements Parser {
             tis = TikaInputStream.get(zipFile.getInputStream(ze));
         } catch (IOException e) {
             //store this exception in the parent's metadata
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
             return;
         }
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/geogebra/GeoGebraParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/geogebra/GeoGebraParser.java
index 087ef04cd8..7db66ec776 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/geogebra/GeoGebraParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/geogebra/GeoGebraParser.java
@@ -310,7 +310,7 @@ public class GeoGebraParser implements Parser {
         }
         if (!zipFile.canReadEntryData(entry)) {
             EmbeddedDocumentUtil.recordEmbeddedStreamException(
-                    new IOException("Unsupported zip entry: " + 
entry.getName()), metadata);
+                    new IOException("Unsupported zip entry: " + 
entry.getName()), metadata, context);
             return;
         }
         try (InputStream is = zipFile.getInputStream(entry)) {
@@ -320,9 +320,9 @@ public class GeoGebraParser implements Parser {
             if (WriteLimitReachedException.isWriteLimitReached(e)) {
                 throw e;
             }
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata, 
context);
         } catch (IOException | TikaException e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata, 
context);
         }
     }
 
@@ -398,7 +398,7 @@ public class GeoGebraParser implements Parser {
             throws IOException, SAXException {
         if (!zipFile.canReadEntryData(entry)) {
             EmbeddedDocumentUtil.recordEmbeddedStreamException(
-                    new IOException("Unsupported zip entry: " + 
entry.getName()), parentMetadata);
+                    new IOException("Unsupported zip entry: " + 
entry.getName()), parentMetadata, context);
             return;
         }
         Metadata embeddedMetadata = Metadata.newInstance(context);
@@ -427,7 +427,7 @@ public class GeoGebraParser implements Parser {
                         embeddedMetadata, context, false);
             }
         } catch (IOException e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
         }
     }
 }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
index bd04f007a8..cbd9cdffbb 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
@@ -174,7 +174,7 @@ public class IDMLParser implements Parser {
             } catch (SecurityException e) {
                 throw e;
             } catch (IOException | SAXException | TikaException | 
RuntimeException e) {
-                EmbeddedDocumentUtil.recordException(e, metadata);   // 
malformed XMP must not fail the IDML
+                EmbeddedDocumentUtil.recordException(e, metadata, context);   
// malformed XMP must not fail the IDML
             }
         } else if (entry.getName().contains("MasterSpreads")) {
             Metadata embeddedMeta = Metadata.newInstance(context);
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
index 4e8a40972a..3dfcc56870 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
@@ -133,7 +133,6 @@ import 
org.apache.tika.renderer.pdf.pdfbox.VectorGraphicsOnlyPDFRenderer;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.EmbeddedContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
-import org.apache.tika.utils.ExceptionUtils;
 import org.apache.tika.utils.StringUtils;
 
 class AbstractPDF2XHTML extends PDFTextStripper {
@@ -288,7 +287,7 @@ class AbstractPDF2XHTML extends PDFTextStripper {
                         
pdfDocument.getDocumentCatalog().getMetadata().exportXMPMetadata())) {
                     extractXMPAsEmbeddedFile(tis, 
XMP_DOCUMENT_CATALOG_LOCATION);
                 } catch (IOException e) {
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
                 }
             }
             //now iterate through the pages
@@ -298,7 +297,7 @@ class AbstractPDF2XHTML extends PDFTextStripper {
                     try (TikaInputStream tis = 
TikaInputStream.get(page.getMetadata().exportXMPMetadata())) {
                         extractXMPAsEmbeddedFile(tis, XMP_PAGE_LOCATION_PREFIX 
+ pageNumber);
                     } catch (IOException e) {
-                        EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                        EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
                     }
                 }
                 pageNumber++;
@@ -319,7 +318,7 @@ class AbstractPDF2XHTML extends PDFTextStripper {
                 try {
                     bytes = 
pdfDocument.getDocumentCatalog().getAcroForm(null).getXFA().getBytes();
                 } catch (IOException e) {
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
                 }
                 if (bytes != null) {
                     try (TikaInputStream tis = TikaInputStream.get(bytes)) {
@@ -508,7 +507,7 @@ class AbstractPDF2XHTML extends PDFTextStripper {
             tis = TikaInputStream.get(pdEmbeddedFile.createInputStream());
         } catch (IOException e) {
             //store this exception in the parent's metadata
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata, 
context);
             return;
         }
 
@@ -768,8 +767,7 @@ class AbstractPDF2XHTML extends PDFTextStripper {
             //image rendering can throw a variety of runtime exceptions, not 
just
             // IOExceptions...
             //need to have a wide catch
-            
metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_EMBEDDED_STREAM,
-                    ExceptionUtils.getStackTrace(e));
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata, 
context);
 
             return new RenderResult(RenderResult.STATUS.EXCEPTION, id, null, 
pageMetadata);
         }
@@ -1356,7 +1354,7 @@ class AbstractPDF2XHTML extends PDFTextStripper {
                 is = new BufferedInputStream(
                         
UnsynchronizedByteArrayInputStream.builder().setByteArray(pdxfa.getBytes()).get());
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
             }
             if (is != null) {
                 try {
@@ -1364,7 +1362,7 @@ class AbstractPDF2XHTML extends PDFTextStripper {
                     return;
                 } catch (XMLStreamException e) {
                     //if there was an xml parse exception in xfa, try the 
AcroForm
-                    EmbeddedDocumentUtil.recordException(e, metadata);
+                    EmbeddedDocumentUtil.recordException(e, metadata, context);
                 } finally {
                     IOUtils.closeQuietly(is);
                 }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
index 9267506822..4ad0e95401 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
@@ -457,7 +457,7 @@ public class PDFParser implements Parser, RenderingParser {
         } catch (SecurityException e) {
             throw e;
         } catch (Exception e) {
-            EmbeddedDocumentUtil.recordException(e, parentMetadata);
+            EmbeddedDocumentUtil.recordException(e, parentMetadata, context);
             return;
         }
         context.get(PDFRenderingState.class).setRenderResults(renderResults);
@@ -472,7 +472,7 @@ public class PDFParser implements Parser, RenderingParser {
                     } catch (SecurityException e) {
                         throw e;
                     } catch (Exception e) {
-                        EmbeddedDocumentUtil.recordException(e, 
parentMetadata);
+                        EmbeddedDocumentUtil.recordException(e, 
parentMetadata, context);
                     }
                 }
             }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDMetadataExtractor.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDMetadataExtractor.java
index bf6b5d6e27..8b066452a9 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDMetadataExtractor.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDMetadataExtractor.java
@@ -52,7 +52,7 @@ public class PDMetadataExtractor {
         try {
             is = pdMetadata.exportXMPMetadata();
         } catch (IOException e) {
-            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata);
+            EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata, 
context);
             return;
         }
         try {
@@ -70,7 +70,7 @@ public class PDMetadataExtractor {
         } catch (SecurityException e) {
             throw e;
         } catch (IOException | SAXException | TikaException | RuntimeException 
e) {
-            EmbeddedDocumentUtil.recordException(e, metadata);   // malformed 
XMP must not fail the PDF
+            EmbeddedDocumentUtil.recordException(e, metadata, context);   // 
malformed XMP must not fail the PDF
         }
         derivePDFAVersion(metadata);
     }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/image/ImageGraphicsEngine.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/image/ImageGraphicsEngine.java
index ec29ce72f4..0f6a7d26fc 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/image/ImageGraphicsEngine.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/image/ImageGraphicsEngine.java
@@ -424,10 +424,10 @@ public class ImageGraphicsEngine extends 
PDFGraphicsStreamEngine {
             try {
                 bufferedImage = writeToBuffer(pdImage, suffix, useDirectJPEG, 
buffer);
             } catch (MissingImageReaderException e) {
-                EmbeddedDocumentUtil.recordException(e, parentMetadata);
+                EmbeddedDocumentUtil.recordException(e, parentMetadata, 
parseContext);
                 return;
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, parseContext);
                 return;
             }
             try (TikaInputStream tis = 
TikaInputStream.get(buffer.toByteArray())) {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/renderer/pdf/pdfbox/PDFBoxRenderer.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/renderer/pdf/pdfbox/PDFBoxRenderer.java
index 7a421d47d2..4307342458 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/renderer/pdf/pdfbox/PDFBoxRenderer.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/renderer/pdf/pdfbox/PDFBoxRenderer.java
@@ -162,7 +162,7 @@ public class PDFBoxRenderer implements PDDocumentRenderer {
                 m.set(TikaPagedText.PAGE_ROTATION, 
(double)pdDocument.getPage(i - 1).getRotation());
                 results.add(renderPage(renderer, id, i, m, parseContext));
             } catch (IOException e) {
-                EmbeddedDocumentUtil.recordException(e, m);
+                EmbeddedDocumentUtil.recordException(e, m, parseContext);
                 results.add(new RenderResult(RenderResult.STATUS.EXCEPTION, 
id, null, m));
             }
         }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/PackageParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/PackageParser.java
index be9b12f503..cba7fc9d22 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/PackageParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/PackageParser.java
@@ -186,7 +186,7 @@ public class PackageParser extends AbstractArchiveParser {
         } else {
             EmbeddedDocumentUtil.recordEmbeddedStreamException(
                     new TikaException("Can't read archive stream (" + name + 
")"),
-                    parentMetadata);
+                    parentMetadata, context);
             if (name != null && !name.isEmpty()) {
                 xhtml.element("p", name);
             }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/ZipParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/ZipParser.java
index a9905abad6..5b369292ea 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/ZipParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/ZipParser.java
@@ -471,7 +471,7 @@ public class ZipParser extends AbstractArchiveParser {
         String name = detectEntryName(entry, context, config);
 
         if (entry.getGeneralPurposeBit().usesEncryption()) {
-            handleEncryptedEntry(name, parentMetadata, xhtml);
+            handleEncryptedEntry(name, parentMetadata, xhtml, context);
             return;
         }
 
@@ -483,7 +483,7 @@ public class ZipParser extends AbstractArchiveParser {
         if (!zipFile.canReadEntryData(entry)) {
             EmbeddedDocumentUtil.recordEmbeddedStreamException(
                     new TikaException("Can't read archive stream (" + name + 
")"),
-                    parentMetadata);
+                    parentMetadata, context);
             if (name != null && !name.isEmpty()) {
                 xhtml.element("p", name);
             }
@@ -502,7 +502,7 @@ public class ZipParser extends AbstractArchiveParser {
                     () -> zipFile.getInputStream(entry), tmp, entryMetadata)) {
                 extractor.parseEmbedded(tis, xhtml, entryMetadata, context, 
true);
             } catch (UnsupportedZipFeatureException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
             } finally {
                 tmp.dispose();
             }
@@ -519,14 +519,14 @@ public class ZipParser extends AbstractArchiveParser {
 
         if (!zis.canReadEntryData(entry)) {
             if (entry.getGeneralPurposeBit().usesEncryption()) {
-                handleEncryptedEntry(name, parentMetadata, xhtml);
+                handleEncryptedEntry(name, parentMetadata, xhtml, context);
             } else if (entry.getGeneralPurposeBit().usesDataDescriptor()
                     && entry.getMethod() == java.util.zip.ZipEntry.STORED) {
                 throw new 
UnsupportedZipFeatureException(Feature.DATA_DESCRIPTOR, entry);
             } else {
                 EmbeddedDocumentUtil.recordEmbeddedStreamException(
                         new TikaException("Can't read archive stream (" + name 
+ ")"),
-                        parentMetadata);
+                        parentMetadata, context);
                 if (name != null && !name.isEmpty()) {
                     xhtml.element("p", name);
                 }
@@ -544,7 +544,7 @@ public class ZipParser extends AbstractArchiveParser {
                 TikaInputStream tis = TikaInputStream.get(zis, tmp, 
entryMetadata);
                 extractor.parseEmbedded(tis, xhtml, entryMetadata, context, 
true);
             } catch (UnsupportedZipFeatureException e) {
-                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata);
+                EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
parentMetadata, context);
             } finally {
                 tmp.dispose();
             }
@@ -594,10 +594,10 @@ public class ZipParser extends AbstractArchiveParser {
     }
 
     private void handleEncryptedEntry(String name, Metadata parentMetadata,
-                                       XHTMLContentHandler xhtml) throws 
SAXException {
+                                       XHTMLContentHandler xhtml, ParseContext 
context) throws SAXException {
         EmbeddedDocumentUtil.recordEmbeddedStreamException(
                 new EncryptedDocumentException("stream (" + name + ") is 
encrypted"),
-                parentMetadata);
+                parentMetadata, context);
         if (name != null && !name.isEmpty()) {
             xhtml.element("p", name);
         }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java
index af1a9e7f47..8ae1257d38 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java
@@ -410,7 +410,7 @@ public class MarkdownParser extends 
AbstractEncodingDetectorParser {
                 try (TikaInputStream tis = 
TikaInputStream.get(dataURIScheme.getInputStream())) {
                     extractor.parseEmbedded(tis, xhtml, m, context, true);
                 } catch (IOException e) {
-                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata);
+                    EmbeddedDocumentUtil.recordEmbeddedStreamException(e, 
metadata, context);
                 } catch (SAXException e) {
                     throw new RuntimeSAXException(e);
                 }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/warc/WARCParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/warc/WARCParser.java
index d4349ab20f..975563222f 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/warc/WARCParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/warc/WARCParser.java
@@ -111,12 +111,12 @@ public class WARCParser implements Parser {
             try {
                 processResponse((WarcResponse) record, xhtml, context, 
embeddedDocumentExtractor);
             } catch (IOException | TikaException e) {
-                EmbeddedDocumentUtil.recordException(e, metadata);
+                EmbeddedDocumentUtil.recordException(e, metadata, context);
             } catch (SAXException e) {
                 if (WriteLimitReachedException.isWriteLimitReached(e)) {
                     throw e;
                 } else {
-                    EmbeddedDocumentUtil.recordException(e, metadata);
+                    EmbeddedDocumentUtil.recordException(e, metadata, context);
                 }
             }
         } else if (WARCINFO.equals(record.type())) {

Reply via email to