static void PrintSignaturesInfo(string in_docpath) { Console.Out.WriteLine("================================================================================"); Console.Out.WriteLine("Reading and printing digital signature information"); using (PDFDoc doc = new PDFDoc(in_docpath)) { if (!doc.HasSignatures()) { Console.Out.WriteLine("Doc has no signatures."); Console.Out.WriteLine("================================================================================"); return; } else { Console.Out.WriteLine("Doc has signatures."); } for (FieldIterator fitr = doc.GetFieldIterator(); fitr.HasNext(); fitr.Next()) { if (fitr.Current().IsLockedByDigitalSignature()) { Console.Out.WriteLine("==========\nField locked by a digital signature"); } else { Console.Out.WriteLine("==========\nField not locked by a digital signature"); } Console.Out.WriteLine("Field name: " + fitr.Current().GetName()); Console.Out.WriteLine("=========="); } Console.Out.WriteLine("====================\nNow iterating over digital signatures only.\n===================="); DigitalSignatureFieldIterator digsig_fitr = doc.GetDigitalSignatureFieldIterator(); for (; digsig_fitr.HasNext(); digsig_fitr.Next()) { Console.Out.WriteLine("=========="); Console.Out.WriteLine("Field name of digital signature: " + new Field(digsig_fitr.Current().GetSDFObj()).GetName()); DigitalSignatureField digsigfield = digsig_fitr.Current(); if (!digsigfield.HasCryptographicSignature()) { Console.Out.WriteLine("Either digital signature field lacks a digital signature dictionary, " + "or digital signature dictionary lacks a cryptographic hash entry. " + "Digital signature field is not presently considered signed.\n" + "=========="); continue; } int cert_count = digsigfield.GetCertCount(); Console.Out.WriteLine("Cert count: " + cert_count); for (int i = 0; i < cert_count; ++i) { byte[] cert = digsigfield.GetCert(i); Console.Out.WriteLine("Cert #" + i + " size: " + cert.Length); } DigitalSignatureField.SubFilterType subfilter = digsigfield.GetSubFilter(); Console.Out.WriteLine("Subfilter type: " + (int)subfilter); if (subfilter != DigitalSignatureField.SubFilterType.e_ETSI_RFC3161) { Console.Out.WriteLine("Signature's signer: " + digsigfield.GetSignatureName()); Date signing_time = digsigfield.GetSigningTime(); if (signing_time.IsValid()) { Console.Out.WriteLine("Signing day: " + (int)signing_time.day); } Console.Out.WriteLine("Location: " + digsigfield.GetLocation()); Console.Out.WriteLine("Reason: " + digsigfield.GetReason()); Console.Out.WriteLine("Contact info: " + digsigfield.GetContactInfo()); } else { Console.Out.WriteLine("SubFilter == e_ETSI_RFC3161 (DocTimeStamp; no signing info)\n"); } Console.Out.WriteLine(((digsigfield.HasVisibleAppearance()) ? "Visible" : "Not visible")); DigitalSignatureField.DocumentPermissions digsig_doc_perms = digsigfield.GetDocumentPermissions(); string[] locked_fields = digsigfield.GetLockedFields(); foreach (string field_name in locked_fields) { Console.Out.WriteLine("This digital signature locks a field named: " + field_name); } switch (digsig_doc_perms) { case DigitalSignatureField.DocumentPermissions.e_no_changes_allowed: Console.Out.WriteLine("No changes to the document can be made without invalidating this digital signature."); break; case DigitalSignatureField.DocumentPermissions.e_formfilling_signing_allowed: Console.Out.WriteLine("Page template instantiation, form filling, and signing digital signatures are allowed without invalidating this digital signature."); break; case DigitalSignatureField.DocumentPermissions.e_annotating_formfilling_signing_allowed: Console.Out.WriteLine("Annotating, page template instantiation, form filling, and signing digital signatures are allowed without invalidating this digital signature."); break; case DigitalSignatureField.DocumentPermissions.e_unrestricted: Console.Out.WriteLine("Document not restricted by this digital signature."); break; default: throw new Exception("Unrecognized digital signature document permission level."); } Console.Out.WriteLine("=========="); } } Console.Out.WriteLine("================================================================================"); }
static void CertifyPDF(string in_docpath, string in_cert_field_name, string in_private_key_file_path, string in_keyfile_password, string in_appearance_image_path, string in_outpath) { Console.Out.WriteLine("================================================================================"); Console.Out.WriteLine("Certifying PDF document"); // Open an existing PDF using (PDFDoc doc = new PDFDoc(in_docpath)) { Console.Out.WriteLine("PDFDoc has " + (doc.HasSignatures() ? "signatures" : "no signatures")); Page page1 = doc.GetPage(1); // Create a random text field that we can lock using the field permissions feature. TextWidget annot1 = TextWidget.Create(doc, new Rect(50, 550, 350, 600), "asdf_test_field"); page1.AnnotPushBack(annot1); /* Create new signature form field in the PDFDoc. The name argument is optional; * leaving it empty causes it to be auto-generated. However, you may need the name for later. * Acrobat doesn't show digsigfield in side panel if it's without a widget. Using a * Rect with 0 width and 0 height, or setting the NoPrint/Invisible flags makes it invisible. */ DigitalSignatureField certification_sig_field = doc.CreateDigitalSignatureField(in_cert_field_name); SignatureWidget widgetAnnot = SignatureWidget.Create(doc, new Rect(0, 100, 200, 150), certification_sig_field); page1.AnnotPushBack(widgetAnnot); // (OPTIONAL) Add an appearance. // Widget AP from image Image img = Image.Create(doc, in_appearance_image_path); widgetAnnot.CreateSignatureAppearance(img); // End of optional appearance-adding code. // Add permissions. Lock the random text field. Console.Out.WriteLine("Adding document permissions."); certification_sig_field.SetDocumentPermissions(DigitalSignatureField.DocumentPermissions.e_annotating_formfilling_signing_allowed); Console.Out.WriteLine("Adding field permissions."); string[] fields_to_lock = new string[1]; fields_to_lock[0] = "asdf_test_field"; certification_sig_field.SetFieldPermissions(DigitalSignatureField.FieldPermissions.e_include, fields_to_lock); #if USE_DOTNET_CRYPTO DotNetCryptoSignatureHandler sigHandler = new DotNetCryptoSignatureHandler(in_private_key_file_path, in_keyfile_password); SDF.SignatureHandlerId sigHandlerId = doc.AddSignatureHandler(sigHandler); found_approval_signature_digsig_field.CertifyOnNextSaveWithCustomHandler(sigHandlerId); #else certification_sig_field.CertifyOnNextSave(in_private_key_file_path, in_keyfile_password); #endif ///// (OPTIONAL) Add more information to the signature dictionary. certification_sig_field.SetLocation("Vancouver, BC"); certification_sig_field.SetReason("Document certification."); certification_sig_field.SetContactInfo("www.pdftron.com"); ///// End of optional sig info code. // Save the PDFDoc. Once the method below is called, PDFNetC will also sign the document using the information provided. doc.Save(in_outpath, 0); } Console.Out.WriteLine("================================================================================"); }