Novedades en GroupDocs.Signature para Python 26.1 (enero 2026)
| ID | Categoría | Resumen |
|---|---|---|
| SIGNATURENET‑5528 | ✨ Funcionalidad | Soporte y validación de firmas digitales en imágenes (incrustación esteganográfica de LSB para PNG y JPG). |
| SIGNATURENET‑5445 | ✨ Funcionalidad | Renderizado adaptativo para vistas previas de firmas de código de barras y códigos QR – control explícito de ancho/alto. |
| SIGNATURENET‑5479 | ✨ Funcionalidad | Soporte de rotación para imágenes de vista previa de códigos de barras y códigos QR. |
| SIGNATURENET‑5478 | ✨ Funcionalidad | Se añadió manejo de formatos de imagen APNG y TGA para firmas basadas en imágenes. |
| SIGNATURENET‑5500 | ⚡ Mejora | Optimización de consultas al estilo LINQ para búsqueda y verificación de firmas (filtrado por predicados). |
| SIGNATURENET‑5480 | ⚡ Mejora | Soporte de transparencia de fondo para vistas previas de códigos de barras/QR. |
| SIGNATURENET‑5477 | ⚡ Mejora | Soporte de superposición de imagen para firmas digitales con color de fondo (bandera de imagen en primer plano). |
| SIGNATURENET‑5422 | ⚡ Mejora | Eliminación de algoritmos de cifrado inseguros (RC2, DES, TripleDES y modos AES débiles). |
| SIGNATURENET‑5555 | 🐞 Corrección de error | Corregida la excepción de inicializador de tipo de GeneratePreview() para archivos DOC en Linux. |
A continuación se muestra una breve revisión técnica de los cambios más impactantes.
1. Firma digital en imagen (esteganografía)
- Las firmas se ocultan en los bits menos significativos de los píxeles PNG/JPG.
- Protegido por contraseña, compatible con flujos, 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 códigos QR
Los desarrolladores ahora pueden especificar width y height exactos para la generación de vistas previas, eliminando las inconsistencias de “tamaño automático” 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)
3. Soporte de rotación para vistas previas de códigos de barras y QR
Establece 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)
4. Nuevo soporte de formato de imagen – APNG & TGA
Los archivos APNG (PNG animado) y TGA (Targa) ahora pueden usarse como firmas de imagen, insertarse, previsualizarse y verificarse exactamente como PNG/JPG.
5. Transparencia de fondo para vistas previas de códigos de barras/QR
Establece 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)
6. Soporte de superposición de imagen para firmas digitales
PdfDigitalSignatureAppearance ahora respeta una imagen superpuesta y un color de fondo sin ocultar la imagen. Controla la capa 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}")
7. Refuerzo de seguridad – eliminación de algoritmos inseguros
RC2, DES, TripleDES y modos AES débiles han sido eliminados de la pila criptográfica. 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
Las operaciones de search y verify de firmas ahora aceptan funciones de 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()]
# 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}")
Verificación con un predicado
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. Corrección del bloqueo al previsualizar 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-netse usa para el contenedor Python‑via‑.NET.
Recursos
- Notas completas de la versión: (link to the official release notes page, if available)
- Documentación: https://docs.groupdocs.com/signature/python/
- Comunidad y Soporte: https://forum.groupdocs.com/c/signature/10
Mantente atento a próximas versiones y sigue el blog oficial para consejos de rendimiento y guías de buenas prácticas.