Extraire l'image et les informations de signature

Le fragment de code suivant fonctionne également avec la bibliothèque Aspose.PDF.Drawing.

Extraction d’image depuis le champ de signature

Aspose.PDF for .NET prend en charge la fonctionnalité de signature numérique des fichiers PDF à l’aide de la classe SignatureField et, lors de la signature du document, vous pouvez également définir une image pour SignatureAppearance. Cette API offre désormais la capacité d’extraire les informations de signature ainsi que l’image associée au champ de signature.

Pour extraire les informations de signature, nous avons introduit la méthode ExtractImage dans la classe SignatureField. Veuillez consulter le fragment de code suivant qui montre les étapes pour extraire une image depuis l’objet SignatureField :

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractImagesFromSignatureField()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "ExtractingImage.pdf"))
    {
        // Searching for signature fields
        foreach (var field in document.Form)
        {
            var sf = field as Aspose.Pdf.Forms.SignatureField;
            if (sf == null)
            {
                continue;
            }

            using (Stream imageStream = sf.ExtractImage())
            {
                if (imageStream != null)
                {
                    continue;
                }

                using (System.Drawing.Image image = System.Drawing.Bitmap.FromStream(imageStream))
                {
                    // Save the image
                    image.Save(dataDir + "output_out.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                }
            }
        }
    }
}

Extraction des informations de signature

Aspose.PDF for .NET prend en charge la fonctionnalité de signature numérique des fichiers PDF à l’aide de la classe SignatureField. Actuellement, nous pouvons également déterminer la validité du certificat mais nous ne pouvons pas extraire le certificat complet. Les informations pouvant être extraites sont une clé publique, une empreinte, l’émetteur, etc.

Pour extraire les informations de signature, nous avons introduit la méthode ExtractCertificate dans la classe SignatureField. Veuillez consulter le fragment de code suivant qui montre les étapes pour extraire le certificat depuis l’objet SignatureField :

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractCertificate()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "ExtractSignatureInfo.pdf"))
    {
        // Searching for signature fields
        foreach (var field in document.Form)
        {
            var sf = field as Aspose.Pdf.Forms.SignatureField;
            if (sf == null)
            {
                continue;
            }
            // Extract certificate
            Stream cerStream = sf.ExtractCertificate();
            if (cerStream == null)
            {
                continue;
            }
            // Save certificate
            using (cerStream)
            {
                byte[] bytes = new byte[cerStream.Length];
                using (FileStream fs = new FileStream(dataDir + "input.cer", FileMode.CreateNew))
                {
                    cerStream.Read(bytes, 0, bytes.Length);
                    fs.Write(bytes, 0, bytes.Length);
                }
            }
        }
    }
}

Vous pouvez utiliser la méthode PdfFileSignature.TryExtractCertificate pour extraire un flux de certificat ou un objet X509Certificate2.

Vous pouvez obtenir des informations sur les algorithmes de signature du document.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private void GetSignaturesInfo()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "signed_rsa.pdf"))
    {
        using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
        {
            var sigNames = signature.GetSignatureNames();
            var signaturesInfoList =  signature.GetSignaturesInfo();
            foreach (var sigInfo in signaturesInfoList)
            {
                Console.WriteLine(sigInfo.DigestHashAlgorithm);
                Console.WriteLine(sigInfo.AlgorithmType);
                Console.WriteLine(sigInfo.CryptographicStandard);
                Console.WriteLine(sigInfo.SignatureName);
            }
        }
    }
}

Exemple de sortie pour l’exemple ci‑dessus :

Sha256
Rsa
Pkcs7
Signature1

Vérification des signatures pour compromission

Vous pouvez utiliser la classe SignaturesCompromiseDetector pour vérifier les signatures numériques en cas de compromission. Appelez la méthode Check() pour vérifier les signatures du document.
Si aucune compromission de signature n’est détectée, la méthode renverra true.
Si la méthode renvoie false, vous pouvez vérifier si des signatures compromises sont présentes à l’aide de la propriété HasCompromisedSignatures et récupérer la liste des signatures compromises via la propriété CompromisedSignatures.

Pour vérifier si les signatures existantes couvrent l’intégralité du document, utilisez la propriété SignaturesCoverage.
Cette propriété peut prendre les valeurs suivantes :

  • Undefined – si l’une des signatures est explicitement compromise ou si la vérification de couverture a échoué.
  • EntirelySigned – si les signatures couvrent l’intégralité du document.
  • PartiallySigned – si les signatures ne couvrent pas tout le document et qu’il existe du contenu non signé.

Voici la traduction avec conservation du markdown :


Extraction de contenu non signé

Vous pouvez extraire le contenu non signé d’un document à l’aide de la classe UnsignedContentAbsorber.
Si un document signé a été modifié de manière non incrémentale, les objets dans la structure PDF peuvent être réarrangés, rendant impossible la détermination des parties initialement signées et de celles qui ne le sont pas. Dans ce cas, l’absorbeur indiquera que le document a été modifié de façon non incrémentale.

Si le document a été modifié de façon incrémentale, nous pouvons détecter ce qui a changé. Malheureusement, comme les flux de contenu des pages sont compressés, il est impossible de déterminer quelle portion exacte du texte d’une page a été modifiée, ainsi l’absorbeur marquera toute la page comme modifiée.

Autres changements suivis :

  • modifications des champs de formulaire
  • modifications des annotations
  • modifications des images
  • modifications des XForms affichés sur les pages

Si les annotations, champs ou XForms sont modifiés d’une manière qui affecte leur apparence, l’absorbeur signalera également ces changements.
Le résultat du traitement est représenté par la classe UnsignedContentAbsorber.Result.

1. UnsignedContentAbsorber.Result

Représente le résultat de la tentative d’obtention du contenu non signé d’un document PDF.

Propriété Type Description
Success bool true si l’opération s’est terminée avec succès et que le contenu non signé a été identifié (ou si le document ne possède aucune signature).
UnsignedContent UnsignedContentAbsorber.UnsignedContent Un objet contenant les collections de pages, champs de formulaire, XForms et annotations détectés qui ne sont pas couverts par la signature.
Message string Un message texte décrivant le résultat.
Coverage SignaturesCoverage Le niveau de couverture de la signature : Undefined, EntirelySigned, PartiallySigned.

2. UnsignedContentAbsorber.UnsignedContent

Conteneur regroupant tous les éléments du document PDF non couverts par la signature numérique.
Cette classe est utilisée à l’intérieur de Result et fournit un accès pratique aux objets détectés.

Propriété Type Description
Pages List<Page> Liste des pages dont le contenu n’est pas couvert par la signature (ou qui ont été modifiées après la signature). Si une page est considérée comme modifiée, ses XForms ne sont pas vérifiés et n’apparaissent pas dans la liste des XForms.
Forms List<WidgetAnnotation> Liste des champs de formulaire (zones de texte, cases à cocher, etc.) qui ont été ajoutés ou modifiés sans signature.
XForms Dictionary<int, XForm> Dictionnaire où la clé est le numéro de page et la valeur est un objet XForm qui a été modifié après la signature.
Annotations Dictionary<int, Annotation> Dictionnaire des annotations, où la clé est le numéro de page et la valeur est une annotation modifiée sans signature.