Skip to content

Commit 3b7c28d

Browse files
authored
1 parent b586685 commit 3b7c28d

4 files changed

Lines changed: 29 additions & 7 deletions

File tree

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

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

154+
/**
155+
* Has at least one AcroForm signature field (/FT /Sig), whether or not it has been signed.
156+
* For documents that have been actually signed, see {@link TikaCoreProperties#HAS_SIGNATURE}.
157+
*/
158+
Property HAS_SIGNATURE_FIELDS = Property.internalBoolean(PDF_PREFIX + "hasSignatureFields");
159+
154160
Property HAS_MARKED_CONTENT = Property.internalBoolean(PDF_PREFIX + "hasMarkedContent");
155161

156162
/**

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: 10 additions & 4 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,13 +399,19 @@ private void checkAccessPermissions(PDFParserConfig.AccessCheckMode mode, Metada
398399
}
399400

400401
private void extractSignatures(PDDocument pdfDocument, Metadata metadata) {
402+
List<PDSignatureField> sigFields = pdfDocument.getSignatureFields();
403+
if (sigFields.isEmpty()) {
404+
return;
405+
}
406+
metadata.set(PDF.HAS_SIGNATURE_FIELDS, true);
407+
401408
boolean hasSignature = false;
402-
for (PDSignature signature : pdfDocument.getSignatureDictionaries()) {
409+
for (PDSignatureField sigField : sigFields) {
410+
PDSignature signature = sigField.getSignature();
403411
if (signature == null) {
404412
continue;
405413
}
406414
PDMetadataExtractor.addNotNull(signature.getName(), metadata, TikaCoreProperties.SIGNATURE_NAME);
407-
408415
Calendar date = signature.getSignDate();
409416
if (date != null) {
410417
metadata.add(TikaCoreProperties.SIGNATURE_DATE, date);
@@ -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: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -621,17 +621,27 @@ public void testTurningOffBookmarks() throws Exception {
621621
//TIKA-1226
622622
@Test
623623
public void testSignatureInAcroForm() throws Exception {
624-
//The current test doc does not contain any content in the signature area.
625-
//This just tests that a RuntimeException is not thrown.
626-
//TODO: find a better test file for this issue.
627624
XMLResult result = getXML("testPDF_acroform3.pdf");
628625
Metadata m = result.metadata;
629626
assertEquals("true", m.get(PDF.HAS_XMP));
630627
assertEquals("true", m.get(PDF.HAS_ACROFORM_FIELDS));
631628
assertEquals("false", m.get(PDF.HAS_XFA));
629+
assertEquals("true", m.get(PDF.HAS_SIGNATURE_FIELDS));
630+
assertNull(m.get(TikaCoreProperties.HAS_SIGNATURE));
632631
assertContains("<li>aTextField: TIKA-1226</li>", result.xml);
633632
}
634633

634+
//TIKA-4756
635+
@Test
636+
public void testUnsignedSignatureField() throws Exception {
637+
// PDF has an AcroForm with /SigFlags 1 and a /Sig type field, but no actual signature value.
638+
// Should detect the signature field but not report hasSignature.
639+
Metadata m = getXML("testPDF_sigflags.pdf").metadata;
640+
assertEquals("true", m.get(PDF.HAS_ACROFORM_FIELDS));
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)