Extrair Imagem e Informações da Assinatura

O trecho de código a seguir também funciona com a biblioteca Aspose.PDF.Drawing.

Extraindo Imagem do Campo de Assinatura

Aspose.PDF for .NET oferece o recurso de assinar digitalmente arquivos PDF usando a classe SignatureField e, ao assinar o documento, você também pode definir uma imagem para SignatureAppearance. Agora, esta API também fornece a capacidade de extrair informações da assinatura, bem como a imagem associada ao campo de assinatura.

Para extrair informações da assinatura, introduzimos o método ExtractImage na classe SignatureField. Veja o trecho de código a seguir que demonstra as etapas para extrair uma imagem do objeto 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);
                }
            }
        }
    }
}

Extrair Informações da Assinatura

Aspose.PDF for .NET oferece o recurso de assinar digitalmente arquivos PDF usando a classe SignatureField. Atualmente, também podemos determinar a validade do certificado, mas não podemos extrair o certificado completo. As informações que podem ser extraídas são a chave pública, impressão digital, emissor, etc.

Para extrair informações da assinatura, introduzimos o método ExtractCertificate na classe SignatureField. Veja o trecho de código a seguir que demonstra as etapas para extrair o certificado do objeto 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);
                }
            }
        }
    }
}

Você pode usar o método PdfFileSignature.TryExtractCertificate para extrair um fluxo de certificado ou um objeto X509Certificate2.

Você pode obter informações sobre os algoritmos de assinatura do documento.

// 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);
            }
        }
    }
}

Saída de exemplo para o exemplo acima:

Sha256
Rsa
Pkcs7
Signature1

Verificando comprometimento de assinaturas

Você pode usar a classe SignaturesCompromiseDetector para verificar se assinaturas digitais foram comprometidas. Chame o método Check() para verificar as assinaturas do documento. Se nenhum comprometimento de assinatura for detectado, o método retornará true. Se o método retornar false, você pode verificar se há assinaturas comprometidas usando a propriedade HasCompromisedSignatures e obter a lista de assinaturas comprometidas através da propriedade CompromisedSignatures.

Para verificar se as assinaturas existentes cobrem todo o documento, use a propriedade SignaturesCoverage. Esta propriedade pode ter os seguintes valores:

  • Undefined – se uma das assinaturas estiver explicitamente comprometida ou a verificação de cobertura falhar.
  • EntirelySigned – se as assinaturas cobrirem todo o documento.
  • PartiallySigned – se as assinaturas não cobrirem todo o documento e houver conteúdo não assinado.

Aqui está a tradução com preservação do markdown:


Extraindo Conteúdo Não Assinado

Você pode extrair conteúdo não assinado de um documento usando a classe UnsignedContentAbsorber. Se um documento assinado foi modificado não incrementalmente, os objetos na estrutura PDF podem ser reorganizados, tornando impossível determinar quais partes foram originalmente assinadas e quais não foram. Nesses casos, o absorvedor indicará que o documento foi modificado não‑incrementalmente.

Se o documento foi modificado incrementalmente, podemos detectar o que mudou. Infelizmente, como os fluxos de conteúdo das páginas são comprimidos, é impossível determinar qual parte exata do texto de uma página foi alterada, portanto o absorvedor marcará a página inteira como modificada.

Outras alterações que são rastreadas:

  • alterações em campos de formulário
  • alterações em anotações
  • alterações em imagens
  • alterações em XForms exibidos nas páginas

Se anotações, campos ou XForms forem modificados de forma que impacte sua aparência, o absorvedor também relatará essas alterações. O resultado do processamento é representado pela classe UnsignedContentAbsorber.Result.

1. UnsignedContentAbsorber.Result

Representa o resultado da tentativa de obter conteúdo não assinado de um documento PDF.

Propriedade Tipo Descrição
Success bool true se a operação foi concluída com sucesso e o conteúdo não assinado foi identificado (ou se o documento não possui assinaturas).
UnsignedContent UnsignedContentAbsorber.UnsignedContent Um objeto contendo coleções de páginas detectadas, campos de formulário, XForms e anotações que não estão cobertos pela assinatura.
Message string Uma mensagem textual descrevendo o resultado.
Coverage SignaturesCoverage O nível de cobertura da assinatura: Undefined, EntirelySigned, PartiallySigned.

2. UnsignedContentAbsorber.UnsignedContent

Um contêiner que contém todos os elementos do documento PDF não cobertos pela assinatura digital. Esta classe é usada dentro de Result e fornece acesso conveniente aos objetos detectados.

Propriedade Tipo Descrição
Pages List<Page> Uma lista de páginas cujo conteúdo não está coberto pela assinatura (ou foi modificado após a assinatura). Se uma página for considerada modificada, seus XForms não são verificados e não aparecem na lista de XForms.
Forms List<WidgetAnnotation> Uma lista de campos de formulário (campos de texto, caixas de seleção, etc.) que foram adicionados ou modificados sem uma assinatura.
XForms Dictionary<int, XForm> Um dicionário onde a chave é o número da página e o valor é um objeto XForm que foi modificado após a assinatura.
Annotations Dictionary<int, Annotation> Um dicionário de anotações, onde a chave é o número da página e o valor é uma anotação modificada sem assinatura.