Извлечь информацию об изображении и подписи

The following code snippet also works with Aspose.PDF.Drawing library.

Извлечение изображения из поля подписи

Aspose.PDF for .NET поддерживает возможность цифровой подписи PDF‑файлов с помощью класса SignatureField, и при подписании документа можно также задать изображение для SignatureAppearance. Теперь этот API предоставляет возможность извлекать информацию о подписи, а также изображение, связанное с полем подписи.

Для извлечения информации о подписи мы добавили метод ExtractImage в класс SignatureField. Посмотрите следующий фрагмент кода, демонстрирующий шаги по извлечению изображения из объекта 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);
                }
            }
        }
    }
}

Извлечение информации о подписи

Aspose.PDF for .NET поддерживает возможность цифровой подписи PDF‑файлов с помощью класса SignatureField. В настоящее время мы можем определять действительность сертификата, но не можем извлечь весь сертификат. Извлекаемая информация включает открытый ключ, отпечаток, издателя и т.д.

Для извлечения информации о подписи мы добавили метод ExtractCertificate в класс SignatureField. Посмотрите следующий фрагмент кода, демонстрирующий шаги по извлечению сертификата из объекта 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);
                }
            }
        }
    }
}

Вы можете использовать метод PdfFileSignature.TryExtractCertificate для извлечения потока сертификата или объекта X509Certificate2.

Вы можете получить информацию о алгоритмах подписи документа.

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

Пример вывода для приведённого выше примера:

Sha256
Rsa
Pkcs7
Signature1

Проверка подписей на компрометацию

Вы можете использовать класс SignaturesCompromiseDetector для проверки цифровых подписей на компрометацию.
Вызовите метод Check(), чтобы проверить подписи документа.
Если компрометация подписей не обнаружена, метод вернёт true.
Если метод вернёт false, вы можете проверить, использует ли компрометированная подпись свойство HasCompromisedSignatures, и получить список компрометированных подписей через свойство CompromisedSignatures.

Чтобы проверить, охватывают ли существующие подписи весь документ, используйте свойство SignaturesCoverage.
Это свойство может принимать следующие значения:

  • Undefined – если одна из подписей явно компрометирована или проверка охвата завершилась неудачей.
  • EntirelySigned – если подписи охватывают весь документ.
  • PartiallySigned – если подписи не охватывают весь документ и есть неподписанное содержимое.

Вот перевод с сохранением markdown:


Извлечение неподписанного содержимого

Вы можете извлечь неподписанное содержимое из документа с помощью класса UnsignedContentAbsorber.
Если подписанный документ был изменён неинкрементально, объекты в структуре PDF могут быть переставлены, что делает невозможным определение, какие части изначально были подписаны, а какие нет. В таких случаях абсорбер укажет, что документ был изменён неинкрементально.

Если документ был изменён инкрементально, мы можем определить, что изменилось. К сожалению, поскольку потоки содержимого страниц сжаты, невозможно точно определить, какая часть текста страницы была изменена, поэтому абсорбер пометит всю страницу как изменённую.

Отслеживаемые другие изменения:

  • изменения полей формы
  • изменения аннотаций
  • изменения изображений
  • изменения XForm, отображаемых на страницах

Если аннотации, поля или XForm изменены так, что это влияет на их внешний вид, абсорбер также сообщит об этих изменениях.
Результат обработки представлен классом UnsignedContentAbsorber.Result.

1. UnsignedContentAbsorber.Result

Представляет результат попытки получить неподписанное содержимое из PDF‑документа.

Свойство Тип Описание
Success bool true, если операция завершилась успешно и было найдено неподписанное содержимое (или если в документе нет подписей).
UnsignedContent UnsignedContentAbsorber.UnsignedContent Объект, содержащий коллекции обнаруженных страниц, полей формы, XForm и аннотаций, не покрытых подписью.
Message string Текстовое сообщение, описывающее результат.
Coverage SignaturesCoverage Уровень охвата подписи: Undefined, EntirelySigned, PartiallySigned.

2. UnsignedContentAbsorber.UnsignedContent

Контейнер, содержащий все элементы PDF‑документа не покрытые цифровой подписью. Этот класс используется внутри Result и предоставляет удобный доступ к обнаруженным объектам.

Свойство Тип Описание
Pages List<Page> Список страниц, содержимое которых не покрыто подписью (или было изменено после подписания). Если страница считается изменённой, её XForm не проверяются и не появляются в списке XForms.
Forms List<WidgetAnnotation> Список полей формы (текстовые поля, флажки и т.д.), которые были добавлены или изменены без подписи.
XForms Dictionary<int, XForm> Словарь, где ключ — номер страницы, а значение — объект XForm, изменённый после подписания.
Annotations Dictionary<int, Annotation> Словарь аннотаций, где ключ — номер страницы, а значение — аннотация, изменённая без подписи.