Novità di GroupDocs.Signature per Python 26.1 (gennaio 2026)

ID Categoria Riepilogo
SIGNATURENET‑5528 Funzionalità Supporto e validazione della firma digitale immagine (incorporamento steganografico LSB per PNG & JPG).
SIGNATURENET‑5445 Funzionalità Rendering adattivo per le anteprime delle firme Barcode e QR Code – controllo esplicito di larghezza/altezza.
SIGNATURENET‑5479 Funzionalità Supporto alla rotazione per le anteprime delle firme Barcode e QR Code.
SIGNATURENET‑5478 Funzionalità Aggiunto il supporto ai formati immagine APNG e TGA per firme basate su immagine.
SIGNATURENET‑5500 Miglioramento Ottimizzazione delle query in stile LINQ per ricerca e verifica delle firme (filtraggio tramite predicati).
SIGNATURENET‑5480 Miglioramento Supporto alla trasparenza dello sfondo per le anteprime Barcode/QR.
SIGNATURENET‑5477 Miglioramento Supporto all’immagine di sovrapposizione per le firme digitali con colore di sfondo (flag foreground‑image).
SIGNATURENET‑5422 Miglioramento Rimozione degli algoritmi di crittografia non sicuri (RC2, DES, TripleDES e modalità AES deboli).
SIGNATURENET‑5555 🐞 Correzione di bug Risolto l’eccezione GeneratePreview() del type‑initializer per file DOC su Linux.

Di seguito una breve panoramica tecnica delle modifiche più impattanti.

1. Firma digitale immagine (steganografia)

  • Le firme sono nascoste nei bit meno significativi dei pixel PNG/JPG.
  • Protette da password, compatibili con stream e funzionanti con qualsiasi dimensione immagine ≥ 8 × 8 px.

Firma di un’immagine

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

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

# Firma l'immagine
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("Immagine firmata correttamente!")
        print(f"Firme aggiunte: {len(sign_result.succeeded)}")

Verifica di un’immagine firmata

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  # opzionale 0‑100%

    verify_result = signature.verify(verify_options)

    if verify_result.is_valid:
        print("La firma digitale è valida!")
        print(f"Firme verificate: {len(verify_result.succeeded)}")
    else:
        print("La firma digitale non è valida o non è stata trovata.")

Validazione avanzata (estrazione completa dei dati)

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"Firma rilevata con probabilità del {verify_options.detected_probability}%")

2. Rendering adattivo per anteprime Barcode & QR Code

Gli sviluppatori ora possono specificare width e height esatti per la generazione dell’anteprima, eliminando le incongruenze del precedente “auto‑size”.

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

# Opzioni QR code
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"

# Generazione anteprima
preview_options = gso.PreviewSignatureOptions(
    qr_sign_options,
    create_signature_stream,   # delegato fornito dall'utente
    release_signature_stream   # delegato fornito dall'utente
)
preview_options.signature_id   = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

Adaptive QR preview

3. Supporto alla rotazione per anteprime Barcode & QR

Imposta rotation_angle (gradi) sulle opzioni barcode/QR per renderizzare le anteprime ruotate.

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   # ruota di 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)

Rotated barcode

4. Nuovo supporto ai formati immagine – APNG & TGA

I file APNG (PNG animato) e TGA (Targa) possono ora essere usati come firme immagine, inseriti, visualizzati e verificati esattamente come PNG/JPG.

5. Trasparenza dello sfondo per anteprime Barcode/QR

Imposta la proprietà transparency (0 – 1) sulle opzioni barcode/QR per generare anteprime con canvas trasparente.

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   # sfondo trasparente al 50 %

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)

Transparent barcode

6. Supporto all’immagine di sovrapposizione per firme digitali

PdfDigitalSignatureAppearance ora rispetta un’immagine di sovrapposizione e un colore di sfondo senza coprire l’immagine. Controlla il livello tramite 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"

    # Posizionamento firma visibile
    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   # immagine in primo piano rispetto al testo

    sign_options.appearance = appearance

    sign_result = signature.sign(output_pdf, sign_options)

    print(f"\nDocumento firmato correttamente con {len(sign_result.succeeded)} firma/e.")
    print(f"File firmato salvato in: {output_pdf}")

Overlay image

7. Rafforzamento della sicurezza – rimozione di algoritmi non sicuri

RC2, DES, TripleDES e le modalità AES deboli sono state rimosse dallo stack crittografico. Sono disponibili solo algoritmi moderni approvati dal NIST, migliorando la postura di sicurezza predefinita dei documenti firmati.

8. Ottimizzazione delle query in stile LINQ

Le operazioni search e verify delle firme ora accettano funzioni predicato che filtrano le firme prima dei passaggi di elaborazione intensiva. Ciò riduce l’uso di memoria e velocizza le operazioni batch.

Ricerca con predicato

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

    # Mantieni solo le firme di testo che contengono la parola "Approved"
    result = signature.search(search_options,
        lambda sig: isinstance(sig, gsd.TextSignature) and "Approved" in sig.text)

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

Verifica con predicato

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

    # Verifica solo le firme nella pagina 1
    result = signature.verify(verify_options,
        lambda sig: sig.page_number == 1)

    print(f"Trovate {len(result)} firme verificate nella pagina 1")

9. Risolto crash della preview DOC su Linux

GeneratePreview() non solleva più una TypeInitializerException durante l’elaborazione di file Microsoft Word (.doc) su Linux, ripristinando la funzionalità di preview multipiattaforma.


Istruzioni per l’aggiornamento

pip install --upgrade groupdocs-signature-net

Nota: Il nome del pacchetto groupdocs-signature-net è quello usato per il wrapper Python‑via‑.NET.


Risorse


Rimanete sintonizzati per i prossimi rilasci e tenete d’occhio il blog ufficiale per consigli sulle prestazioni e guide alle best‑practice.