Xiaohong Yang created TIKA-4785:
-----------------------------------
Summary: Tika 3.3.0 Fails to Detect Media Type of Embedded Objects
of LibreOffice Files
Key: TIKA-4785
URL: https://issues.apache.org/jira/browse/TIKA-4785
Project: Tika
Issue Type: Bug
Components: tika-core
Affects Versions: 3.3.0
Environment: Java 21
Reporter: Xiaohong Yang
Attachments: Program_and_Sample_Files.zip
[^Program_and_Sample_Files.zip]
We use Tika to extract embedded objects from LibreOffice files. We also use
Tika to get the media type of the extracted objects. We encountered an issue in
media detection in Tika 3.3.0 in the following method. Note that there is no
issue with Tika 3.2.3. The Java version is 21.
public void parseEmbedded(InputStream inputStream, ContentHandler
contentHandler, Metadata metadata,
boolean outputHtml) throws SAXException, IOException {
String fullFileName =
metadata.get(TikaCoreProperties.{_}RESOURCE_NAME_KEY{_});
if (fullFileName == null) {
fullFileName = "file" + count++;
}
if (config == null) {
System.{_}out{_}.println("config is null");
return;
}
MediaType contentType = config.getDetector().detect(inputStream, metadata);
String tikaExtension = null;
boolean hasExtension = fullFileName.indexOf('.') != -1;
if (!hasExtension && contentType != null) {
try {
tikaExtension =
config.getMimeRepository().forName(contentType.toString()).getExtension();
} catch (Exception e) {
System.{_}out{_}.println("Error with TIKA trying to find the
content type of the file.");
}
}
String[] fileNameSplit = fullFileName.split("/");
String fileName = fileNameSplit[fileNameSplit.length - 1];
File outputFile = new File(outputDir.toFile(),
FilenameUtils.{_}normalize{_}(fileName));
System.{_}out{_}.println("Extracting '" + fileName + " to " + outputFile);
FileOutputStream os = null;
try {
os = new FileOutputStream(outputFile);
if (inputStream instanceof TikaInputStream tin) {
if (tin.getOpenContainer() instanceof DirectoryEntry) {
try(POIFSFileSystem fs = new POIFSFileSystem()){
copy((DirectoryEntry) tin.getOpenContainer(), fs.getRoot());
fs.writeFilesystem(os);
}
} else {
IOUtils.{_}copy{_}(inputStream, os);
}
} else {
IOUtils.{_}copy{_}(inputStream, os);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (os != null) {
os.flush();
os.close();
}
}
}
The error happens at the following line:
MediaType contentType = config.getDetector().detect(inputStream, metadata);
And the error is as follows:
org.apache.tika.exception.TikaException: TIKA-198: Illegal IOException from
org.apache.tika.parser.pkg.PackageParser@32a68f4f
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:304)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:298)
at
org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:198)
at
xyang.tickets.tika.ExtractFromLibreOffice.process(ExtractFromLibreOffice.java:59)
at
xyang.tickets.tika.ExtractFromLibreOffice.main(ExtractFromLibreOffice.java:35)
Caused by: java.io.IOException: mark/reset not supported
at
java.base/java.util.zip.InflaterInputStream.reset(InflaterInputStream.java:314)
Caused by: java.io.IOException: mark/reset not supported
at
org.apache.tika.detect.microsoft.POIFSContainerDetector.isOleHeader(POIFSContainerDetector.java:679)
at
org.apache.tika.detect.microsoft.POIFSContainerDetector.detect(POIFSContainerDetector.java:612)
at
org.apache.tika.detect.CompositeDetector.detect(CompositeDetector.java:84)
at
xyang.tickets.tika.ExtractFromLibreOffice$FileEmbeddedDocumentExtractor.parseEmbedded(ExtractFromLibreOffice.java:79)
at
org.apache.tika.parser.pkg.PackageParser.parseZipEntry(PackageParser.java:444)
at
org.apache.tika.parser.pkg.PackageParser.parseZipFile(PackageParser.java:397)
at
org.apache.tika.parser.pkg.PackageParser._parse(PackageParser.java:277)
at org.apache.tika.parser.pkg.PackageParser.parse(PackageParser.java:261)
at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:298)
... 4 more
Attached are 4 files:
ExtractFromLibreOffice.java --- the standalone program
tika-config.xml --- config file
calc.sxc --- Sample file
impress.sxi --- Sample file
--
This message was sent by Atlassian Jira
(v8.20.10#820010)