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