Novedades en GroupDocs.Signature for Python 26.1 (enero 2026)

ID Categoría Resumen
SIGNATURENET‑5528 Feature Soporte y validación de firma digital de imagen (incrustación esteganográfica LSB para PNG y JPG).
SIGNATURENET‑5445 Feature Renderizado adaptativo para vistas previas de firmas de código de barras y QR – control explícito de ancho/alto.
SIGNATURENET‑5479 Feature Soporte de rotación para imágenes de vista previa de códigos de barras y QR.
SIGNATURENET‑5478 Feature Se añadió manejo de formatos de imagen APNG y TGA para firmas basadas en imágenes.
SIGNATURENET‑5500 Enhancement Optimización de consultas al estilo LINQ para búsqueda y verificación de firmas (filtrado por predicados).
SIGNATURENET‑5480 Enhancement Soporte de transparencia de fondo para vistas previas de códigos de barras/QR.
SIGNATURENET‑5477 Enhancement Soporte de imagen superpuesta para firmas digitales con color de fondo (bandera foreground‑image).
SIGNATURENET‑5422 Enhancement Eliminación de algoritmos de cifrado inseguros (RC2, DES, TripleDES y modos AES débiles).
SIGNATURENET‑5555 🐞 Bug Fix Corregida la excepción GeneratePreview() del inicializador de tipo para archivos DOC en Linux.

A continuación se muestra una breve guía técnica de los cambios más impactantes.

1. Firma digital de imagen (esteganografía)

  • Las firmas se ocultan en los bits menos significativos de los píxeles PNG/JPG.
  • Protegida por contraseña, compatible con streams y funciona con cualquier tamaño de imagen ≥ 8 × 8 px.

Firmando una imagen

import groupdocs.signature as gs
import groupdocs.signature.options as gso

input_file  = "image.png"
output_file = "signed_image.png"
password    = "MySecurePassword123"

# Sign the image
with gs.Signature(input_file) as signature:
    sign_options = gso.ImageDigitalSignOptions()
    sign_options.password = password

    sign_result = signature.sign(output_file, sign_options)

    if sign_result.succeeded and len(sign_result.succeeded) > 0:
        print("Image signed successfully!")
        print(f"Signatures added: {len(sign_result.succeeded)}")

Verificando una imagen firmada

import groupdocs.signature as gs
import groupdocs.signature.options as gso

signed_file = "signed_image.png"
password    = "MySecurePassword123"

with gs.Signature(signed_file) as signature:
    verify_options = gso.ImageDigitalVerifyOptions()
    verify_options.password = password
    verify_options.detection_threshold_percent = 75  # optional 0‑100%

    verify_result = signature.verify(verify_options)

    if verify_result.is_valid:
        print("Digital signature is valid!")
        print(f"Verified signatures: {len(verify_result.succeeded)}")
    else:
        print("Digital signature is invalid or not found.")

Validación avanzada (extracción completa de datos)

with gs.Signature("signed_image.png") as signature:
    verify_options = gso.ImageDigitalVerifyOptions()
    verify_options.password = "MySecurePassword123"
    verify_options.use_full_data_extraction = True
    verify_options.detection_threshold_percent = 85

    verify_result = signature.verify(verify_options)

    if verify_result.is_valid and verify_options.detected_probability is not None:
        print(f"Signature detected with {verify_options.detected_probability}% probability")

2. Renderizado adaptativo para vistas previas de códigos de barras y QR

Los desarrolladores ahora pueden especificar el width y height exactos para la generación de vistas previas, eliminando las inconsistencias de “auto‑size” anteriores.

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import uuid

# QR code options
qr_sign_options = gso.QrCodeSignOptions("GROUP DOCS", gs.QrCodeTypes.QR)
qr_sign_options.width  = 250
qr_sign_options.height = 270
qr_sign_options.fore_color = gs.Color.red
qr_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
qr_sign_options.text = "GROUP DOCS"

# Preview generation
preview_options = gso.PreviewSignatureOptions(
    qr_sign_options,
    create_signature_stream,   # user‑provided delegate
    release_signature_stream   # user‑provided delegate
)
preview_options.signature_id   = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

Vista previa QR adaptativa

3. Soporte de rotación para vistas previas de códigos de barras y QR

Establezca rotation_angle (grados) en las opciones de código de barras/QR para renderizar vistas previas rotadas.

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import uuid

barcode_sign_options = gso.BarcodeSignOptions("GROUP DOCS", gs.BarcodeTypes.MaxiCode)
barcode_sign_options.width          = 400
barcode_sign_options.height         = 400
barcode_sign_options.fore_color     = gs.Color.red
barcode_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
barcode_sign_options.text           = "GROUP DOCS"
barcode_sign_options.rotation_angle = 45   # rotate 45°

preview_options = gso.PreviewSignatureOptions(
    barcode_sign_options,
    create_signature_stream,
    release_signature_stream
)
preview_options.signature_id   = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

Código de barras rotado

4. Soporte de nuevos formatos de imagen – APNG y TGA

Los archivos APNG (PNG animado) y TGA (Targa) ahora pueden usarse como firmas de imagen, insertarse, obtener vistas previas y verificarse exactamente como PNG/JPG.

5. Transparencia de fondo para vistas previas de códigos de barras/QR

Establezca la propiedad transparency (0 – 1) en las opciones de código de barras/QR para generar vistas previas con un lienzo transparente.

barcode_sign_options = gso.BarcodeSignOptions("GROUP DOCS", gs.BarcodeTypes.Codabar)
barcode_sign_options.width  = 400
barcode_sign_options.height = 400
barcode_sign_options.fore_color = gs.Color.red
barcode_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
barcode_sign_options.text = "GROUP DOCS"
barcode_sign_options.transparency = 0.5   # 50 % transparent background

preview_options = gso.PreviewSignatureOptions(
    barcode_sign_options,
    create_signature_stream,
    release_signature_stream
)
preview_options.signature_id = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

Código de barras transparente

6. Soporte de imagen superpuesta para firmas digitales

PdfDigitalSignatureAppearance ahora respeta una imagen superpuesta y un color de fondo sin oscurecer la imagen. Controle el orden de capas mediante SignatureCustomAppearance.IsForegroundImage.

import groupdocs.signature as gs
import groupdocs.signature.options as gso

signature_image_path = "signature.png"
certificate_path      = "JohnSmithCertificate.pfx"

input_pdf  = "SampleDocument.pdf"
output_pdf = "SignedDocument.pdf"

with gs.Signature(input_pdf) as signature:
    sign_options = gso.DigitalSignOptions(certificate_path)
    sign_options.password = "1234567890"
    sign_options.reason   = "Document approval"
    sign_options.contact  = "John Smith"
    sign_options.location = "Head Office"

    # Visible signature placement
    sign_options.visible = True
    sign_options.left    = 350
    sign_options.top     = 100
    sign_options.width   = 200
    sign_options.height  = 70
    sign_options.image_file_path = signature_image_path

    appearance = gso.PdfDigitalSignatureAppearance()
    appearance.foreground = gs.Color.from_argb(50, gs.Color.brown)
    appearance.font_family_name = "Times New Roman"
    appearance.font_size = 12
    appearance.background = gs.Color.from_argb(50, gs.Color.light_gray)
    appearance.is_foreground_image = True   # image on top of text

    sign_options.appearance = appearance

    sign_result = signature.sign(output_pdf, sign_options)

    print(f"\nDocument signed successfully with {len(sign_result.succeeded)} signature(s).")
    print(f"Signed file saved at: {output_pdf}")

Imagen superpuesta

7. Refuerzo de seguridad – eliminación de algoritmos inseguros

RC2, DES, TripleDES y los modos AES débiles han sido eliminados del conjunto criptográfico. Solo están disponibles algoritmos modernos aprobados por NIST, mejorando la postura de seguridad predeterminada de los documentos firmados.

8. Optimización de consultas al estilo LINQ

La search y verify de firmas ahora aceptan funciones predicado que filtran firmas antes de los pasos de procesamiento intensivo. Esto reduce el uso de memoria y acelera las operaciones por lotes.

Búsqueda con un predicado

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import groupdocs.signature.domain as gsd

with gs.Signature("document.pdf") as signature:
    search_options = [gso.TextSearchOptions()]

    # Mantener sólo firmas de texto que contengan la palabra "Approved"
    result = signature.search(search_options,
        lambda sig: isinstance(sig, gsd.TextSignature) and "Approved" in sig.text)

    for sig in result.signatures:
        print(f"Found: {sig.text}")

Verificación con un predicado

with gs.Signature("signed_document.pdf") as signature:
    verify_options = gso.TextVerifyOptions("John Smith")

    # Verificar sólo firmas en la página 1
    result = signature.verify(verify_options,
        lambda sig: sig.page_number == 1)

    print(f"Found {len(result)} verified signatures on page 1")

9. Corrección del bloqueo de vista previa de DOC en Linux

GeneratePreview() ya no lanza una TypeInitializerException al procesar archivos Microsoft Word (.doc) en Linux, restaurando la funcionalidad de vista previa multiplataforma.

Instrucciones de actualización

pip install --upgrade groupdocs-signature-net

Nota: El nombre del paquete groupdocs-signature-net se usa para el wrapper Python‑via‑.NET.

Recursos

Manténgase atento a próximas versiones y siga el blog oficial para obtener consejos de rendimiento y guías de buenas prácticas.