Skip to content

Commit 9343bd2

Browse files
TIKA-4756: Detect unsigned signature fields in PDFs with AcroForm
Adds PDF.HAS_SIGNATURE_FIELDS metadata property (pdf:hasSignatureFields) to distinguish PDFs that contain /FT /Sig AcroForm fields from those with actual applied digital signatures (TikaCoreProperties.HAS_SIGNATURE). Previously, PDFs with unsigned signature fields were not detectable, making it impossible for downstream applications (e.g. PDF/A converters) to identify documents with signature infrastructure that should not be re-processed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent af28c19 commit 9343bd2

4 files changed

Lines changed: 26 additions & 3 deletions

File tree

tika-core/src/main/java/org/apache/tika/metadata/PDF.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,13 @@ public interface PDF {
151151
*/
152152
Property HAS_ACROFORM_FIELDS = Property.internalBoolean(PDF_PREFIX + "hasAcroFormFields");
153153

154+
/**
155+
* Has > 0 AcroForm signature fields (/FT /Sig), regardless of whether a signature
156+
* has been applied. Use {@link TikaCoreProperties#HAS_SIGNATURE} to check for
157+
* an actual applied digital signature.
158+
*/
159+
Property HAS_SIGNATURE_FIELDS = Property.internalBoolean(PDF_PREFIX + "hasSignatureFields");
160+
154161
Property HAS_MARKED_CONTENT = Property.internalBoolean(PDF_PREFIX + "hasMarkedContent");
155162

156163
/**

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.apache.pdfbox.pdmodel.fixup.processor.AcroFormDefaultsProcessor;
5454
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
5555
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
56+
import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField;
5657
import org.xml.sax.ContentHandler;
5758
import org.xml.sax.SAXException;
5859

@@ -398,8 +399,14 @@ private void checkAccessPermissions(PDFParserConfig.AccessCheckMode mode, Metada
398399
}
399400

400401
private void extractSignatures(PDDocument pdfDocument, Metadata metadata) {
402+
List<PDSignatureField> signatureFields = pdfDocument.getSignatureFields();
403+
if (!signatureFields.isEmpty()) {
404+
metadata.set(PDF.HAS_SIGNATURE_FIELDS, true);
405+
}
406+
401407
boolean hasSignature = false;
402-
for (PDSignature signature : pdfDocument.getSignatureDictionaries()) {
408+
for (PDSignatureField sigField : signatureFields) {
409+
PDSignature signature = sigField.getSignature();
403410
if (signature == null) {
404411
continue;
405412
}
@@ -414,11 +421,10 @@ private void extractSignatures(PDDocument pdfDocument, Metadata metadata) {
414421
PDMetadataExtractor.addNotNull(signature.getLocation(), metadata, TikaCoreProperties.SIGNATURE_LOCATION);
415422
PDMetadataExtractor.addNotNull(signature.getReason(), metadata, TikaCoreProperties.SIGNATURE_REASON);
416423
hasSignature = true;
417-
418424
}
419425

420426
if (hasSignature) {
421-
metadata.set(TikaCoreProperties.HAS_SIGNATURE, hasSignature);
427+
metadata.set(TikaCoreProperties.HAS_SIGNATURE, true);
422428
}
423429
}
424430

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,9 +629,19 @@ public void testSignatureInAcroForm() throws Exception {
629629
assertEquals("true", m.get(PDF.HAS_XMP));
630630
assertEquals("true", m.get(PDF.HAS_ACROFORM_FIELDS));
631631
assertEquals("false", m.get(PDF.HAS_XFA));
632+
assertEquals("true", m.get(PDF.HAS_SIGNATURE_FIELDS));
633+
assertNull(m.get(TikaCoreProperties.HAS_SIGNATURE));
632634
assertContains("<li>aTextField: TIKA-1226</li>", result.xml);
633635
}
634636

637+
//TIKA-4756
638+
@Test
639+
public void testUnsignedSignatureField() throws Exception {
640+
Metadata m = getXML("testPDF_unsigned_sig_field.pdf").metadata;
641+
assertEquals("true", m.get(PDF.HAS_SIGNATURE_FIELDS));
642+
assertNull(m.get(TikaCoreProperties.HAS_SIGNATURE));
643+
}
644+
635645
@Test
636646
public void testSingleCloseDoc() throws Exception {
637647
//TIKA-1341

0 commit comments

Comments
 (0)