Nous sommes heureux d’annoncer la sortie de GroupDocs.Watermark for Python v26.10, disponible à partir de octobre 2026. Cette version met à jour le moteur .NET sous-jacent de 26.6 à 26.9 et le runtime .NET intégré de 10.0.0 à 10.0.12. Elle introduit la prise en charge des loggers personnalisés, impose une attribution d’attributs plus stricte et corrige des problèmes critiques liés aux callbacks d’aperçu et à la gestion du flux de pages. De plus, la compatibilité est étendue à Python 3.5–3.14, et la prise en charge des plateformes est clarifiée via des balises de roue strictes.

Nouveautés de cette version

  • [Feature] Accepter un objet Python ou une fonction comme WatermarkerSettings.logger (WATERMARKPYTHON-65)
  • [Enhancement] Mettre à jour le moteur GroupDocs.Watermark de 26.6 à 26.9 (WATERMARKPYTHON-66)
  • [Enhancement] Mettre à jour le runtime .NET intégré de 10.0.0 à 10.0.12 (WATERMARKPYTHON-67)
  • [Enhancement] Lever AttributeError lorsque le code assigne un attribut qu’une classe ne possède pas (WATERMARKPYTHON-68)
  • [Fix] Impossible d’utiliser le package sur Python 3.5 – 3.7 (WATERMARKPYTHON-69)
  • [Fix] pip installe le package sur des versions de Linux et macOS qui ne peuvent pas l’exécuter (WATERMARKPYTHON-70)
  • [Fix] Les callbacks de libération d’aperçu reçoivent None au lieu du flux de page (WATERMARKPYTHON-71)
  • [Fix] Les aperçus de page écrits dans io.BytesIO sont vides (WATERMARKPYTHON-72)
  • [Fix] Les aperçus de page de feuille de calcul écrits via un callback de libération sont tronqués (WATERMARKPYTHON-73)

Modifications de l’API publique

La mise à niveau nécessite d’utiliser la nouvelle roue (pip ≥ 20.3) et de gérer le nouveau AttributeError pour les attributs mal orthographiés ; les autres signatures d’API restent inchangées.

Nouvelles classes et membres

  • Color : un constructeur ; il n’en avait pas.
  • get() sur 4 classes indexées — ReadOnlyListBase, SpreadsheetHeaderFooterCollection, SpreadsheetHeaderFooterSectionCollection, WordProcessingHeaderFooterCollection — comme alternative à x[key] ; leur propriété item est supprimée.

Nouvelles fonctionnalités

Logger personnalisé pour WatermarkerSettings

WatermarkerSettings.logger accepte désormais un objet Python ou une fonction simple. Dans la version 26.6, l’affectation de n’importe quelle valeur levait

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

Le logger peut être un objet qui implémente trace(message), warning(message) et error(message, exception), ou un appelable fn(level, message, exception). Le moteur enregistre un trace lorsqu’il ouvre un fichier et un error (avec le texte de l’exception .NET) lorsqu’il ne peut pas en charger un ; les échecs à l’intérieur du logger sont ignorés.

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)

Attribution stricte d’attributs

L’affectation d’une propriété mal orthographiée ou de style .NET sur un wrapper de filigrane lève désormais un AttributeError au lieu de créer silencieusement un attribut uniquement Python. Cela empêche le code de penser qu’il a modifié le document alors que ce n’est pas le cas.

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

L’erreur levée est :

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

Les affectations de propriétés correctes existantes continuent de fonctionner sans changement.

Exemple de code

Voir les sections Logger personnalisé pour WatermarkerSettings et Attribution stricte d’attributs ci‑dessus.

Comment obtenir la mise à jour

PyPI

Téléchargement direct

Téléchargez les roues pour Windows, Linux et macOS depuis la page GroupDocs.Watermark for Python via .NET 26.10.

Ressources