Nos complace anunciar el lanzamiento de GroupDocs.Watermark for Python v26.10, disponible a partir de octubre de 2026. Esta versión actualiza el motor subyacente de .NET de 26.6 a 26.9 y el tiempo de ejecución incrustado de .NET de 10.0.0 a 10.0.12. Introduce soporte para registradores personalizados, impone una asignación de atributos más estricta y corrige problemas críticos con los callbacks de vista previa y el manejo de flujos de página. Además, la compatibilidad se extiende a Python 3.5–3.14, y el soporte de plataforma se clarifica mediante etiquetas de rueda estrictas.

Novedades en esta versión

  • [Feature] Aceptar un objeto o función de Python como WatermarkerSettings.logger (WATERMARKPYTHON-65)
  • [Enhancement] Actualizar el motor de GroupDocs.Watermark de 26.6 a 26.9 (WATERMARKPYTHON-66)
  • [Enhancement] Actualizar el tiempo de ejecución incrustado de .NET de 10.0.0 a 10.0.12 (WATERMARKPYTHON-67)
  • [Enhancement] Generar AttributeError cuando el código asigna un atributo que la clase no posee (WATERMARKPYTHON-68)
  • [Fix] No se puede usar el paquete en Python 3.5 – 3.7 (WATERMARKPYTHON-69)
  • [Fix] pip instala el paquete en versiones de Linux y macOS que no pueden ejecutarlo (WATERMARKPYTHON-70)
  • [Fix] Los callbacks de lanzamiento de vista previa reciben None en lugar del flujo de página (WATERMARKPYTHON-71)
  • [Fix] Las vistas previas de página escritas a io.BytesIO están vacías (WATERMARKPYTHON-72)
  • [Fix] Las vistas previas de página de hoja de cálculo escritas a través de un callback de lanzamiento se truncan (WATERMARKPYTHON-73)

Cambios en la API pública

Actualizar requiere usar la nueva rueda (pip ≥ 20.3) y manejar el nuevo AttributeError para atributos con errores tipográficos; las demás firmas de la API permanecen sin cambios.

Nuevas clases y miembros

  • Color: un constructor; antes no lo tenía.
  • get() en 4 clases indexadas — ReadOnlyListBase, SpreadsheetHeaderFooterCollection, SpreadsheetHeaderFooterSectionCollection, WordProcessingHeaderFooterCollection — como alternativa a x[key]; su propiedad item se elimina.

Nuevas características

Registrador personalizado para WatermarkerSettings

WatermarkerSettings.logger ahora acepta un objeto de Python o una función simple. En la versión 26.6 asignar cualquier valor generaba

TypeError: _marshal_callback_or_handle: cannot wrap ... as GroupDocs.Watermark.Options.ILogger

El registrador puede ser un objeto que implemente trace(message), warning(message) y error(message, exception), o una función llamable fn(level, message, exception). El motor registra un trace cuando abre un archivo y un error (con el texto de la excepción de .NET) cuando no puede cargarlo; los fallos dentro del registrador se ignoran.

from groupdocs.watermark import Watermarker, WatermarkerSettings

class PrintLogger:
    def trace(self, message):
        print("trace:", message)

    def warning(self, message):
        print("warning:", message)

    def error(self, message, exception):
        print("error:", message, exception)

settings = WatermarkerSettings()
settings.logger = PrintLogger()  # object with the required methods
# or: settings.logger = lambda level, msg, exc: print(level, msg, exc)

with Watermarker("document.pdf", settings) as watermarker:
    print(watermarker.get_document_info().page_count)

Asignación estricta de atributos

Asignar una propiedad con error tipográfico o al estilo .NET en un contenedor de marca de agua ahora genera un AttributeError en lugar de crear silenciosamente un atributo solo de Python. Esto evita que el código crea que ha modificado el documento cuando no lo ha hecho.

from groupdocs.watermark import Watermarker
from groupdocs.watermark.watermarks import TextWatermark, Font

with Watermarker("document.pdf") as wm:
    watermark = TextWatermark("CONFIDENTIAL", Font("Arial", 36))
    # The following line raises an error because the property name is wrong
    watermark.opacity_level = 0.5

El error generado es:

AttributeError: 'TextWatermark' object has no attribute 'opacity_level'; assigning it would not reach the .NET object. Did you mean: 'opacity'?

Las asignaciones correctas de propiedades existentes continúan funcionando sin cambios.

Ejemplo de código

Vea las secciones Registrador personalizado para WatermarkerSettings y Asignación estricta de atributos arriba.

Cómo obtener la actualización

PyPI

Descarga directa

Descargue las ruedas para Windows, Linux y macOS desde la página GroupDocs.Watermark for Python via .NET 26.10.

Recursos