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

asf-gitbox-commits pushed a commit to branch branch_3x
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/branch_3x by this push:
     new d1062b01be TIKA-4756 (#2889)
d1062b01be is described below

commit d1062b01beaeee49b85b4c4763d1888728180a9b
Author: Tim Allison <[email protected]>
AuthorDate: Mon Jun 22 16:30:40 2026 -0400

    TIKA-4756 (#2889)
---
 .../main/java/org/apache/tika/metadata/PDF.java    |  6 ++++++
 .../java/org/apache/tika/parser/pdf/PDFParser.java | 14 ++++++++----
 .../org/apache/tika/parser/pdf/PDFParserTest.java  | 16 +++++++++++---
 .../resources/test-documents/testPDF_sigflags.pdf  | 25 ++++++++++++++++++++++
 4 files changed, 54 insertions(+), 7 deletions(-)

diff --git a/tika-core/src/main/java/org/apache/tika/metadata/PDF.java 
b/tika-core/src/main/java/org/apache/tika/metadata/PDF.java
index f852189365..51451e71df 100644
--- a/tika-core/src/main/java/org/apache/tika/metadata/PDF.java
+++ b/tika-core/src/main/java/org/apache/tika/metadata/PDF.java
@@ -151,6 +151,12 @@ public interface PDF {
      */
     Property HAS_ACROFORM_FIELDS = Property.internalBoolean(PDF_PREFIX + 
"hasAcroFormFields");
 
+    /**
+     * Has at least one AcroForm signature field (/FT /Sig), whether or not it 
has been signed.
+     * For documents that have been actually signed, see {@link 
TikaCoreProperties#HAS_SIGNATURE}.
+     */
+    Property HAS_SIGNATURE_FIELDS = Property.internalBoolean(PDF_PREFIX + 
"hasSignatureFields");
+
     Property HAS_MARKED_CONTENT = Property.internalBoolean(PDF_PREFIX + 
"hasMarkedContent");
 
     /**
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 24996caac3..3874b7382b 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
@@ -55,6 +55,7 @@ import org.apache.pdfbox.pdmodel.fixup.PDDocumentFixup;
 import org.apache.pdfbox.pdmodel.fixup.processor.AcroFormDefaultsProcessor;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
 import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
+import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
@@ -363,13 +364,19 @@ public class PDFParser implements Parser, 
RenderingParser, Initializable {
     }
 
     private void extractSignatures(PDDocument pdfDocument, Metadata metadata) {
+        List<PDSignatureField> sigFields = pdfDocument.getSignatureFields();
+        if (sigFields.isEmpty()) {
+            return;
+        }
+        metadata.set(PDF.HAS_SIGNATURE_FIELDS, true);
+
         boolean hasSignature = false;
-        for (PDSignature signature : pdfDocument.getSignatureDictionaries()) {
+        for (PDSignatureField sigField : sigFields) {
+            PDSignature signature = sigField.getSignature();
             if (signature == null) {
                 continue;
             }
             PDMetadataExtractor.addNotNull(signature.getName(), metadata, 
TikaCoreProperties.SIGNATURE_NAME);
-
             Calendar date = signature.getSignDate();
             if (date != null) {
                 metadata.add(TikaCoreProperties.SIGNATURE_DATE, date);
@@ -379,11 +386,10 @@ public class PDFParser implements Parser, 
RenderingParser, Initializable {
             PDMetadataExtractor.addNotNull(signature.getLocation(), metadata, 
TikaCoreProperties.SIGNATURE_LOCATION);
             PDMetadataExtractor.addNotNull(signature.getReason(), metadata, 
TikaCoreProperties.SIGNATURE_REASON);
             hasSignature = true;
-
         }
 
         if (hasSignature) {
-            metadata.set(TikaCoreProperties.HAS_SIGNATURE, hasSignature);
+            metadata.set(TikaCoreProperties.HAS_SIGNATURE, true);
         }
     }
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
index 9b50edcbc9..dbdab6c9b3 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
@@ -623,17 +623,27 @@ public class PDFParserTest extends TikaTest {
     //TIKA-1226
     @Test
     public void testSignatureInAcroForm() throws Exception {
-        //The current test doc does not contain any content in the signature 
area.
-        //This just tests that a RuntimeException is not thrown.
-        //TODO: find a better test file for this issue.
         XMLResult result = getXML("testPDF_acroform3.pdf");
         Metadata m = result.metadata;
         assertEquals("true", m.get(PDF.HAS_XMP));
         assertEquals("true", m.get(PDF.HAS_ACROFORM_FIELDS));
         assertEquals("false", m.get(PDF.HAS_XFA));
+        assertEquals("true", m.get(PDF.HAS_SIGNATURE_FIELDS));
+        assertNull(m.get(TikaCoreProperties.HAS_SIGNATURE));
         assertContains("<li>aTextField: TIKA-1226</li>", result.xml);
     }
 
+    //TIKA-4756
+    @Test
+    public void testUnsignedSignatureField() throws Exception {
+        // PDF has an AcroForm with /SigFlags 1 and a /Sig type field, but no 
actual signature value.
+        // Should detect the signature field but not report hasSignature.
+        Metadata m = getXML("testPDF_sigflags.pdf").metadata;
+        assertEquals("true", m.get(PDF.HAS_ACROFORM_FIELDS));
+        assertEquals("true", m.get(PDF.HAS_SIGNATURE_FIELDS));
+        assertNull(m.get(TikaCoreProperties.HAS_SIGNATURE));
+    }
+
     @Test
     public void testSingleCloseDoc() throws Exception {
         //TIKA-1341
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/resources/test-documents/testPDF_sigflags.pdf
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/resources/test-documents/testPDF_sigflags.pdf
new file mode 100644
index 0000000000..feedb6cc1f
--- /dev/null
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/resources/test-documents/testPDF_sigflags.pdf
@@ -0,0 +1,25 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /AcroForm << /DA (/Helv 12 Tf 0 g) /Fields [ 2 0 R ] /SigFlags 1 >> /Pages 
3 0 R /Type /Catalog >>
+endobj
+2 0 obj
+<< /F 4 /FT /Sig /P 4 0 R /Rect [ 100 700 400 740 ] /Subtype /Widget /T 
(Signature1) /TU (Please sign here) /Type /Annot >>
+endobj
+3 0 obj
+<< /Count 1 /Kids [ 4 0 R ] /Type /Pages >>
+endobj
+4 0 obj
+<< /Annots [ 2 0 R ] /MediaBox [ 0 0 595 842 ] /Parent 3 0 R /Type /Page >>
+endobj
+xref
+0 5
+0000000000 65535 f 
+0000000015 00000 n 
+0000000132 00000 n 
+0000000271 00000 n 
+0000000330 00000 n 
+trailer << /Root 1 0 R /Size 5 /ID 
[<28f44ccdae44bf0671fedcf568110810><28f44ccdae44bf0671fedcf568110810>] >>
+startxref
+421
+%%EOF

Reply via email to