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 f0674ea29b TIKA-4987: Read EXIF from BigTIFF through
metadata-extractor 2.22.0 (#3381)
f0674ea29b is described below
commit f0674ea29b92c83eb481862db95b3e715ca822d6
Author: Dominik Schmidt <[email protected]>
AuthorDate: Wed Oct 21 14:24:24 2026 +0200
TIKA-4987: Read EXIF from BigTIFF through metadata-extractor 2.22.0 (#3381)
RawTiffParser no longer skips EXIF for BigTIFF, a plain BigTIFF file
parses in TiffParser, and little-endian BigTIFF is detected as
image/tiff by content.
---
CHANGES.txt | 6 +++
.../org/apache/tika/mime/tika-mimetypes.xml | 3 +-
.../java/org/apache/tika/mime/TestMimeTypes.java | 3 +-
.../test/resources/test-documents/testBigTIFF.tif | Bin 0 -> 1148 bytes
.../resources/test-documents/testDNG_bigtiff.dng | Bin 2111 -> 2316 bytes
.../apache/tika/parser/image/RawTiffParser.java | 12 +----
.../tika/detect/image/RawTiffDetectorTest.java | 1 +
.../tika/parser/image/RawTiffParserTest.java | 7 +++
.../apache/tika/parser/image/TiffParserTest.java | 50 +++++++++++++++++++++
.../test/resources/test-documents/testBigTIFF.tif | Bin 0 -> 1148 bytes
.../resources/test-documents/testDNG_bigtiff.dng | Bin 2111 -> 2316 bytes
11 files changed, 69 insertions(+), 13 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index f09d0be37b..72764c0a40 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -74,6 +74,12 @@ Release 4.2.0 - unreleased
* New ICOParser for icons and cursors; image/vnd.microsoft.icon moves to it
from
ImageParser. Tighter OS/2 bitmap array and TGA detection (TIKA-4937).
+
+ * BigTIFF is read through metadata-extractor 2.22.0: EXIF and DNG tags are
extracted from
+ BigTIFF DNGs, which previously yielded only XMP and previews, and a plain
BigTIFF file no
+ longer fails in TiffParser. Little-endian BigTIFF is detected as
image/tiff by content
+ (TIKA-4987).
+
* Previews are extracted from Olympus ORF (also with the OM SYSTEM
MakerNote), Panasonic
RW2, Epson ERF, Kodak KDC and Leaf MOS. Epson ERF is detected by content,
and
image/x-raw-epson, image/x-raw-kodak and image/x-raw-leaf are sub-classes
of
diff --git
a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
index 652923e86b..6cf9dd7a9c 100644
--- a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
+++ b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
@@ -6800,8 +6800,9 @@
<match value="MM\x00\x2a" type="string" offset="0"/>
<!-- II*. = Little endian (I=Intel) and 0x002a in little endian -->
<match value="II\x2a\x00" type="string" offset="0"/>
- <!-- MM.+ = Big endian (M=Motorola) and 0x002a in big endian-->
+ <!-- BigTIFF: 0x002b (43) in place of 42, big and little endian -->
<match value="MM\x00\x2b" type="string" offset="0"/>
+ <match value="II\x2b\x00" type="string" offset="0"/>
</magic>
<glob pattern="*.tiff"/>
<glob pattern="*.tif"/>
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/mime/TestMimeTypes.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/mime/TestMimeTypes.java
index c00a913bfd..e6ee585b45 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/mime/TestMimeTypes.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/mime/TestMimeTypes.java
@@ -923,8 +923,7 @@ public class TestMimeTypes {
assertTypeByNameAndData("image/x-raw-pentax", "testPEF.pef");
assertTypeByData("image/tiff", "testDNG.dng");
assertTypeByNameAndData("image/x-raw-adobe", "testDNG.dng");
- //BigTIFF has no image/tiff data magic here (TiffParser can't read
BigTIFF yet),
- //so a BigTIFF DNG resolves by name+data via the glob, not by data
alone
+ assertTypeByData("image/tiff", "testDNG_bigtiff.dng");
assertTypeByNameAndData("image/x-raw-adobe", "testDNG_bigtiff.dng");
assertTypeByData("image/x-canon-cr2", "testCR2.cr2");
assertTypeByNameAndData("image/x-canon-cr2", "testCR2.cr2");
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testBigTIFF.tif
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testBigTIFF.tif
new file mode 100644
index 0000000000..cb416fccfd
Binary files /dev/null and
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testBigTIFF.tif
differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testDNG_bigtiff.dng
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testDNG_bigtiff.dng
index c223eb0f07..47ec8a83b8 100644
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testDNG_bigtiff.dng
and
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/resources/test-documents/testDNG_bigtiff.dng
differ
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 6763048ed2..da58f555f7 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
@@ -82,8 +82,7 @@ import org.apache.tika.sax.XHTMLContentHandler;
* accepted for displayable images: PhotometricInterpretation RGB or YCbCr,
* or 8 bits per sample when PhotometricInterpretation is absent (CR2).
* Both classic TIFF and BigTIFF containers (allowed for DNG since spec
- * version 1.7) are supported for preview extraction; for BigTIFF, EXIF
- * metadata extraction is skipped until metadata-extractor supports it.
+ * version 1.7) are supported.
* <p>
* Of the previews that are extracted (see the length limits in
* {@link RawTiffParserConfig}), the largest by JPEG byte length is marked
@@ -233,14 +232,7 @@ public class RawTiffParser extends TiffParser {
xhtml.endDocument();
return;
}
- if (magic == MAGIC_BIG_TIFF) {
- //metadata-extractor cannot read BigTIFF containers yet:
- //scan for XMP, but skip EXIF metadata extraction
- tis.getFile();
- ImageXmp.scanAndExtract(tis, metadata, context);
- } else {
- extractMetadata(tis, handler, metadata, context);
- }
+ extractMetadata(tis, handler, metadata, context);
RawTiffParserConfig config = getConfig(context);
XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata,
context);
xhtml.startDocument();
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/detect/image/RawTiffDetectorTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/detect/image/RawTiffDetectorTest.java
index 6bd56fd945..b75b28d12e 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/detect/image/RawTiffDetectorTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/detect/image/RawTiffDetectorTest.java
@@ -63,6 +63,7 @@ public class RawTiffDetectorTest {
"testORF_omsystem.orf, image/x-raw-olympus",
"testRW2.rw2, image/x-raw-panasonic",
"testTIFF.tif, image/tiff",
+ "testBigTIFF.tif, image/tiff",
"testJPEG.jpg, image/jpeg"})
public void testDetectionWithoutName(String file, String expected) throws
Exception {
try (InputStream is =
getClass().getResourceAsStream("/test-documents/" + file);
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/parser/image/RawTiffParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/parser/image/RawTiffParserTest.java
index 23f5c9f189..8b04637453 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/parser/image/RawTiffParserTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/parser/image/RawTiffParserTest.java
@@ -349,6 +349,13 @@ public class RawTiffParserTest extends TikaTest {
Metadata container = metadataList.get(0);
assertEquals("image/x-raw-adobe",
container.get(HttpHeaders.CONTENT_TYPE));
assertNull(container.get(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING));
+ assertEquals("PENTAX", container.get(TIFF.EQUIPMENT_MAKE));
+ assertEquals("PENTAX K-x", container.get(TIFF.EQUIPMENT_MODEL));
+ assertEquals("0.004", container.get(TIFF.EXPOSURE_TIME));
+ assertEquals("5.6", container.get(TIFF.F_NUMBER));
+ assertEquals("200", container.get(TIFF.ISO_SPEED_RATINGS));
+ assertEquals("50.0", container.get(TIFF.FOCAL_LENGTH));
+ assertEquals("2010-01-01T12:00:00", container.get(TIFF.ORIGINAL_DATE));
assertThumbnail(metadataList.get(1), 64, 48);
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/parser/image/TiffParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/parser/image/TiffParserTest.java
new file mode 100644
index 0000000000..6df382bf29
--- /dev/null
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/parser/image/TiffParserTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.parser.image;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.tika.TikaTest;
+import org.apache.tika.metadata.HttpHeaders;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TIFF;
+import org.apache.tika.metadata.TikaCoreProperties;
+
+public class TiffParserTest extends TikaTest {
+
+ @Test
+ public void testBigTiff() throws Exception {
+ Metadata metadata = getXML("testBigTIFF.tif").metadata;
+ assertEquals("image/tiff", metadata.get(HttpHeaders.CONTENT_TYPE));
+
assertNull(metadata.get(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING));
+ assertEquals("16", metadata.get(TIFF.IMAGE_WIDTH));
+ assertEquals("12", metadata.get(TIFF.IMAGE_LENGTH));
+ assertEquals("Apache", metadata.get(TIFF.EQUIPMENT_MAKE));
+ assertEquals("Tika BigTIFF", metadata.get(TIFF.EQUIPMENT_MODEL));
+ assertEquals("tika-test", metadata.get(TIFF.SOFTWARE));
+ assertEquals("Inch", metadata.get(TIFF.RESOLUTION_UNIT));
+ assertEquals("72.0", metadata.get(TIFF.RESOLUTION_HORIZONTAL));
+ assertEquals("0.004", metadata.get(TIFF.EXPOSURE_TIME));
+ assertEquals("5.6", metadata.get(TIFF.F_NUMBER));
+ assertEquals("200", metadata.get(TIFF.ISO_SPEED_RATINGS));
+ assertEquals("50.0", metadata.get(TIFF.FOCAL_LENGTH));
+ assertEquals("2024-05-06T07:08:09", metadata.get(TIFF.ORIGINAL_DATE));
+ }
+}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/resources/test-documents/testBigTIFF.tif
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/resources/test-documents/testBigTIFF.tif
new file mode 100644
index 0000000000..cb416fccfd
Binary files /dev/null and
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/resources/test-documents/testBigTIFF.tif
differ
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/resources/test-documents/testDNG_bigtiff.dng
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/resources/test-documents/testDNG_bigtiff.dng
index c223eb0f07..47ec8a83b8 100644
Binary files
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/resources/test-documents/testDNG_bigtiff.dng
and
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/resources/test-documents/testDNG_bigtiff.dng
differ