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

Reply via email to