Nouveautés de GroupDocs.Signature pour Python 26.1 (janvier 2026)

ID Catégorie Résumé
SIGNATURENET‑5528 Fonctionnalité Prise en charge et validation des signatures numériques d’image (intégration stéganographique du bit de poids faible pour PNG & JPG).
SIGNATURENET‑5445 Fonctionnalité Rendu adaptatif des aperçus de signatures Barcode et QR Code – contrôle explicite de la largeur/hauteur.
SIGNATURENET‑5479 Fonctionnalité Prise en charge de la rotation des images d’aperçu Barcode et QR Code.
SIGNATURENET‑5478 Fonctionnalité Ajout de la prise en charge des formats d’image APNG et TGA pour les signatures basées sur des images.
SIGNATURENET‑5500 Amélioration Optimisation des requêtes de type LINQ pour la recherche et la vérification de signatures (filtrage par prédicat).
SIGNATURENET‑5480 Amélioration Prise en charge de la transparence de l’arrière-plan pour les aperçus Barcode/QR.
SIGNATURENET‑5477 Amélioration Prise en charge d’une image superposée pour les signatures numériques avec couleur d’arrière-plan (drapeau image‑premier‑plan).
SIGNATURENET‑5422 Amélioration Suppression des algorithmes de chiffrement non sécurisés (RC2, DES, TripleDES et modes AES faibles).
SIGNATURENET‑5555 🐞 Correction de bogue Correction de l’exception GeneratePreview() du type‑initialiseur pour les fichiers DOC sous Linux.

Voici un bref aperçu technique des changements les plus impactants.

1. Signature numérique d’image (stéganographie)

  • Les signatures sont cachées dans les bits de poids faible des pixels PNG/JPG.
  • Protégées par mot de passe, compatibles avec les flux, et fonctionnent avec toute taille d’image ≥ 8 × 8 px.

Signer une image

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)}")

Vérifier une image signée

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.")

Validation avancée (extraction complète des données)

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. Rendu adaptatif pour les aperçus Barcode et QR Code

Les développeurs peuvent désormais spécifier une width et une height exactes pour la génération d’aperçu, éliminant les incohérences de « taille automatique » précédentes.

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)

Aperçu QR adaptatif

3. Prise en charge de la rotation pour les aperçus Barcode et QR

Définissez rotation_angle (degrés) sur les options barcode/QR pour rendre des aperçus tournés.

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)

Barcode tourné

4. Prise en charge de nouveaux formats d’image – APNG et TGA

Les fichiers APNG (PNG animé) et TGA (Targa) peuvent désormais être utilisés comme signatures d’image, insérés, prévisualisés et vérifiés exactement comme les PNG/JPG.

5. Transparence de l’arrière‑plan pour les aperçus Barcode/QR

Définissez la propriété transparency (0 – 1) sur les options barcode/QR pour générer des aperçus avec un canevas transparent.

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)

Barcode transparent

6. Prise en charge d’une image superposée pour les signatures numériques

PdfDigitalSignatureAppearance accepte désormais une image superposée et une couleur d’arrière‑plan sans masquer l’image. Contrôlez le superposition via 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}")

Image superposée

7. Renforcement de la sécurité – suppression des algorithmes non sécurisés

RC2, DES, TripleDES et les modes AES faibles ont été supprimés de la pile cryptographique. Seuls les algorithmes modernes, approuvés par le NIST, sont disponibles, améliorant la posture de sécurité par défaut des documents signés.

8. Optimisation de requêtes de type LINQ

Les méthodes search et verify des signatures acceptent désormais des fonctions prédicats qui filtrent les signatures avant les étapes de traitement intensif. Cela réduit l’utilisation de mémoire et accélère les opérations par lots.

Recherche avec un prédicat

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()]

    # Keep only text signatures that contain the word "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}")

Vérification avec un prédicat

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

    # Verify only signatures on page 1
    result = signature.verify(verify_options,
        lambda sig: sig.page_number == 1)

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

9. Correction du plantage d’aperçu DOC sous Linux

GeneratePreview() ne lance plus de TypeInitializerException lors du traitement des fichiers Microsoft Word (.doc) sous Linux, restaurant la fonctionnalité d’aperçu multiplateforme.

Instructions de mise à jour

pip install --upgrade groupdocs-signature-net

Remarque : Le nom du paquet groupdocs-signature-net est utilisé pour le wrapper Python‑via‑.NET.

Ressources

Restez à l’affût des prochaines versions et surveillez le blog officiel pour des conseils de performance et des guides de bonnes pratiques.