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

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

Aspose.PDF for Python via .NET позволяет вам извлечь визуальное изображение, встроенное в Поле подписи. Это полезно, когда нужно отображать или архивировать внешний вид подписи без рендеринга полного PDF.

Пример ниже перебирает все поля формы, находя каждое SignatureField, и сохраняет его изображение в файл JPEG:

import sys
from os import path
import aspose.pdf as ap
import aspose.pydrawing as drawing

def extract_images_from_signature_field(infile: str, outfile: str) -> None:
    """Extract the image stored in a signature field."""
    with ap.Document(infile) as document:
        for field in document.form:
            if not isinstance(field, ap.forms.SignatureField):
                continue

            image_stream = field.extract_image()
            if image_stream is None:
                continue

            image = drawing.Bitmap.from_stream(image_stream)
            image.save(outfile, drawing.imaging.ImageFormat.jpeg)

Прочитать детали алгоритма подписи

Использовать PdfFileSignature.get_signatures_info() чтобы прочитать криптографические метаданные для каждой подписи в документе — включая алгоритм хеша, тип алгоритма, криптографический стандарт и имя подписи:

import sys
from os import path
import aspose.pdf as ap
import aspose.pydrawing as drawing

def get_signatures_info(infile: str) -> None:
    """Print information about all signatures in a PDF document."""
    with ap.Document(infile) as document:
        with ap.facades.PdfFileSignature(document) as signature:
            for signature_info in signature.get_signatures_info():
                print(signature_info.DIGEST_HASH_ALGORITHM)
                print(signature_info.ALGORITHM_TYPE)
                print(signature_info.CRYPTOGRAPHIC_STANDARD)
                print(signature_info.signature_name)

Извлечь цифровой сертификат из поля подписи

Используйте extract_certificate метод на SignatureField получить встроенный сертификат в виде потока байтов и сохранить его на диск для внешней проверки:

import sys
from os import path
import aspose.pdf as ap
import aspose.pydrawing as drawing

def extract_certificate(infile: str, outfile: str) -> None:
    """Extract a certificate from a signature field and save it to disk."""
    with ap.Document(infile, password="owner") as document:
        for field in document.form:
            if not isinstance(field, ap.forms.SignatureField):
                continue

            certificate_stream = field.extract_certificate()
            if certificate_stream is None:
                continue

            with certificate_stream:
                bytes_data = bytearray(certificate_stream.length)
                certificate_stream.read(bytes_data, 0, len(bytes_data))
                with open(outfile, "wb") as file_stream:
                    file_stream.write(bytes_data)
                return

Извлечение сертификатов с помощью фасада PdfFileSignature

PdfFileSignature.try_extract_certificate() предоставляет альтернативный способ получения сертификатов по имени подписи. В следующем примере происходит перебор всех имён подписей и попытка извлечения для каждого:

import sys
from os import path
import aspose.pdf as ap
import aspose.pydrawing as drawing

def extract_certificate_try_extract_certificate_method(infile: str) -> None:
    """Extract certificates with the try_extract_certificate facade method."""
    with ap.Document(infile, password="owner") as document:
        with ap.facades.PdfFileSignature(document) as signature:
            for signature_name in signature.get_signature_names(True):
                certificate = []
                if signature.try_extract_certificate(signature_name, certificate):
                    print("The certificate extraction succeeded")

Проверить внешние цифровые подписи

Чтобы подтвердить, что документ не был изменён после подписания, проверьте каждую внешнюю подпись, используя PdfFileSignature.verify_signature(). Пример ниже вызывает исключение для любой подписи, которая не проходит проверку:

import sys
from os import path
import aspose.pdf as ap
import aspose.pydrawing as drawing

def verify_external_signature(infile: str) -> None:
    """Verify an external signature in a PDF document."""
    with ap.Document(infile) as document:
        with ap.facades.PdfFileSignature(document) as pdf_signature:
            for signature_name in pdf_signature.get_signature_names(True):
                if not pdf_signature.verify_signature(signature_name):
                    raise Exception("Not verified")

Обнаружить компрометированные подписи

SignaturesCompromiseDetector проверяет, были ли какие-либо цифровые подписи в документе аннулированы последующими изменениями. Используйте это в юридических, финансовых или комплаенс‑процессах, где необходимо гарантировать целостность документа.

Пример ниже проверяет наличие скомпрометированных подписей и выводит их имена вместе с общим покрытием подписей в документе:

import sys
from os import path
import aspose.pdf as ap
import aspose.pydrawing as drawing

def check(infile: str) -> None:
    """Check whether a PDF contains compromised signatures."""
    with ap.Document(infile) as document:
        detector = ap.SignaturesCompromiseDetector(document)
        result = []

        if detector.check(result):
            print("No signature compromise detected")
            return

        if result[0].has_compromised_signatures:
            print(
                f"Count of compromised signatures: {len(result[0].COMPROMISED_SIGNATURES)}"
            )
            for signature_name in result[0].COMPROMISED_SIGNATURES:
                print(f"Signature name: {signature_name.FULL_NAME}")

        print(result[0].signatures_coverage)

Связанные темы безопасности