Nous sommes heureux d’annoncer la sortie de GroupDocs.Assembly for Python v26.11, disponible depuis novembre 2026. Cette version apporte d’importantes améliorations de prise en charge des plateformes — y compris les premiers wheels pour Linux et macOS — ainsi qu’une prise en charge native des sources de données Python, une gestion des erreurs améliorée et des dépendances mises à jour. Elle introduit également plusieurs nouvelles fonctionnalités et des changements incompatibles afin de s’aligner sur les pratiques Python modernes et .NET 10.

Nouveautés de cette version

  • [Feature] Ajouter des wheels pour Linux x64 et macOS (Intel et Apple Silicon) (ASSEMBLYPYTHON-26)
  • [Feature] Ajouter la prise en charge d’un dict ou d’une liste Python comme source de données (ASSEMBLYPYTHON-27)
  • [Feature] Ajouter la prise en charge d’un gestionnaire Python du chargement de tables de document (IDocumentTableLoadHandler) (ASSEMBLYPYTHON-28)
  • [Feature] Ajouter la prise en charge des types Python lorsque l’API attend un Type .NET (DocumentTableColumn.type, known_types) (ASSEMBLYPYTHON-29)
  • [Feature] Ajouter la prise en charge de l’application de la licence depuis la variable d’environnement GROUPDOCS_LIC_PATH (ASSEMBLYPYTHON-30)
  • [Enhancement] Mettre à jour GroupDocs.Assembly vers la version 26.7 et le runtime intégré vers .NET 10.0.14 (ASSEMBLYPYTHON-31)
  • [Enhancement] Distribuer un paquet pure-Python pour Python 3.5 – 3.14 à la place de l’extension compilée (ASSEMBLYPYTHON-32)
  • [Enhancement] Accepter un DataSourceInfo dans assemble_document() ainsi qu’une liste (ASSEMBLYPYTHON-33)
  • [Enhancement] Lever FileNotFoundError pour un fichier manquant, LicenseError pour une licence qui ne peut pas être appliquée, et GroupDocsAssemblyException pour les autres erreurs du moteur (ASSEMBLYPYTHON-34)
  • [Enhancement] Renommer BarcodeSettings.x_resolution/y_resolution en xresolution/yresolution, et faire de use_reflection_optimization un attribut de classe (ASSEMBLYPYTHON-35)
  • [Enhancement] Supprimer le wheel Windows 32 bits (ASSEMBLYPYTHON-36)
  • [Fix] Corriger les vulnérabilités CVE dans la version 25.5.1 : zlib 1.2.11 → 1.2.12 (+4 autres) (ASSEMBLYPYTHON-11)

Modifications de l’API publique

Les utilisateurs qui mettent à jour doivent renommer x_resolution/y_resolution et set_use_reflection_optimization(), et intercepter GroupDocsAssemblyException et LicenseError là où ils capturaient RuntimeError. Tout le reste est additionnel.

Nouvelles classes et membres

  • groupdocs.assembly : FontSettings, FolderFontSource, IFontSource, SearchOption, OoxmlCompliance, GroupDocsAssemblyException, LicenseError, LicenseWarning.
  • LoadSaveOptions : ooxml_compliance.
  • KnownTypeSet : append().
  • DocumentTableCollection, DocumentTableColumnCollection : get().
  • DocumentTableRelationCollection : append(), get().

Renommé

  • BarcodeSettings.x_resolution → BarcodeSettings.xresolution
  • BarcodeSettings.y_resolution → BarcodeSettings.yresolution

Les anciens noms lèvent AttributeError avec une suggestion « Did you mean », à la lecture et à l’affectation.

Supprimé

  • DocumentAssembler.set_use_reflection_optimization() : attribuez l’attribut de classe à la place, DocumentAssembler.use_reflection_optimization = False.

Modifié

  • DataSourceInfo accepte un dict ou une liste.
  • assemble_document() accepte un DataSourceInfo ou une liste.
  • DocumentTableSet(path, load_handler) accepte une fonction Python ou un objet avec handle(args).
  • DocumentTableColumn.type et KnownTypeSet.add() acceptent un type Python.
  • Les erreurs du moteur lèvent FileNotFoundError, RuntimeError, LicenseError ou GroupDocsAssemblyException. except Exception capture les erreurs des deux versions.

Nouvelles fonctionnalités

Linux et macOS

26.11 propose des wheels pour Linux x64 (manylinux_2_27_x86_64, glibc 2.27 ou plus récent) et pour macOS 12 ou plus récent sur Intel (macosx_12_0_x86_64) et Apple Silicon (macosx_12_0_arm64), en plus de Windows x64. La version 25.5 ne proposait que des wheels Windows. pip 20.3 ou plus récent sélectionne le wheel correspondant à la plateforme. Sous Linux, le runtime .NET nécessite ICU, et les modèles de présentation nécessitent libgdiplus (voir Exigences).

pip install groupdocs-assembly-net==26.11.0

Données Python comme source de données

DataSourceInfo accepte un dict, une liste de dicts ou une liste de valeurs telles quelles ; la version 25.5 levait TypeError pour un dict. L’enveloppe transforme les données en objets .NET typés selon leur forme, ainsi les nombres, chaînes, bool, datetime, date et valeurs Decimal sont accessibles dans le modèle typé : <<[o.OrderDate.Month]>> et <<if [c.Vip]>> fonctionnent comme sur des objets .NET. Les dicts d’une même liste partagent un type avec l’union de leurs clés.

from groupdocs.assembly import DataSourceInfo, DocumentAssembler

orders = [
    {"Number": 10001, "Product": "Harbor Blend whole bean coffee", "Quantity": 30, "Price": 552.0},
    {"Number": 10004, "Product": "Aged harbour cheddar", "Quantity": 8, "Price": 132.0},
]

# order-table.docx: a table whose row <<foreach [o in orders]>><<[o.Number]>> ... <</foreach>> repeats per order
DocumentAssembler().assemble_document("order-table.docx", "order-table-report.docx", [
    DataSourceInfo("Quayside Bistro", "customer"),
    DataSourceInfo(orders, "orders"),
])

Une source de données sans liste

assemble_document() accepte un DataSourceInfo ou une liste de ceux‑ci, comme le fait params DataSourceInfo[] de .NET. La version 25.5 nécessitait une liste et levait TypeError: can't build Array value from 'groupdocs.assembly.DataSourceInfo' lorsqu’un seul était fourni.

from groupdocs.assembly import DataSourceInfo, DocumentAssembler

customer = {"Name": "Quayside Bistro", "Product": "Harbor Blend whole bean coffee"}
DocumentAssembler().assemble_document("hello-world.docx", "hello-world-report.docx", DataSourceInfo(customer, "customer"))

Gestionnaires de chargement de tables

DocumentTableSet(path, load_handler) accepte une fonction Python (args), ou un objet avec une méthode handle(args), et l’appelle pour chaque table du document avant son chargement. Le gestionnaire définit args.options pour cette table, ou ignore la table avec args.is_loaded = False ; args.table_index indique quelle table il s’agit. La version 25.5 levait TypeError pour une fonction Python.

from groupdocs.assembly.data import DocumentTableOptions, DocumentTableSet


def on_table(args):
    options = DocumentTableOptions()
    options.first_row_contains_column_names = True
    args.options = options


tables = DocumentTableSet("contracts.xlsx", on_table)
for table in tables.tables:
    print(table.name, [column.name for column in table.columns])

Types Python lorsque l’API attend un type .NET

Un type Python représente le type .NET qu’un membre attend : float pour System.Double, int, str, bool, datetime. Une colonne d’une table de document peut être rendue numérique afin qu’un graphique la somme, et known_types permet à un modèle d’appeler les membres statiques d’un type ; il accepte également le nom d’un type .NET. La version 25.5 levait TypeError: can't build Type value from 'type'.

from groupdocs.assembly import DataSourceInfo, DocumentAssembler
from groupdocs.assembly.data import DocumentTable, DocumentTableOptions

options = DocumentTableOptions()
options.first_row_contains_column_names = True
contracts = DocumentTable("contracts.xlsx", 0, options)
contracts.columns["Price"].type = float

assembler = DocumentAssembler()
assembler.known_types.add("System.Math")  # templates can call <<[Math.Round(x, 1)]>>
assembler.assemble_document("table-row.docx", "table-row-report.docx", DataSourceInfo(contracts, "contracts"))

Licence depuis l’environnement

Définissez GROUPDOCS_LIC_PATH sur le chemin d’un fichier de licence, ou sur une URL qui en fournit une, et la licence est appliquée lors du premier appel du moteur, sans code de licence ; la version 25.5 ne lisait pas la variable. Si cette licence ne peut pas être appliquée (fichier manquant, abonnement expiré, licence pour un autre produit), chaque appel du moteur lève LicenseError, indiquant la variable et la raison du moteur, jusqu’à ce que License().set_license() applique une licence. Définissez GROUPDOCS_LIC_STRICT=0 pour obtenir un LicenseWarning et le mode d’évaluation à la place.

from groupdocs.assembly import DataSourceInfo, DocumentAssembler, LicenseError

customer = {"Name": "Quayside Bistro", "Product": "Harbor Blend whole bean coffee"}
try:
    DocumentAssembler().assemble_document("hello-world.docx", "hello-world-report.docx", DataSourceInfo(customer, "customer"))
except LicenseError as e:
    print(e)  # GROUPDOCS_LIC_PATH=... could not be applied: <reason>

Erreurs par type

La version 25.5 levait un RuntimeError brut (« Proxy error(<.NET exception>): … ») pour chaque erreur du moteur. La version 26.11 lève FileNotFoundError pour un modèle ou un fichier de données manquant, qui dérive toujours de RuntimeError ; RuntimeError avec uniquement le message du moteur pour une erreur de modèle ou un membre manquant dans les données ; LicenseError pour une licence qui ne peut pas être appliquée ; et GroupDocsAssemblyException pour les autres erreurs du moteur. LicenseError et GroupDocsAssemblyException sont importables depuis groupdocs.assembly et ne dérivent pas de RuntimeError.

from groupdocs.assembly import DataSourceInfo, DocumentAssembler, GroupDocsAssemblyException

try:
    DocumentAssembler().assemble_document("no-such-template.docx", "report.docx", DataSourceInfo({"Name": "A"}, "customer"))
except FileNotFoundError as e:
    print("missing:", e)
except (RuntimeError, GroupDocsAssemblyException) as e:
    print("engine:", e)

Exemple de code

from groupdocs.assembly import DataSourceInfo, DocumentAssembler, FileFormat, LoadSaveOptions, OoxmlCompliance

options = LoadSaveOptions(FileFormat.DOCX)
options.ooxml_compliance = OoxmlCompliance.STRICT
customer = {"Name": "Quayside Bistro", "Product": "Harbor Blend whole bean coffee"}
DocumentAssembler().assemble_document("hello-world.docx", "hello-world-strict.docx", options, DataSourceInfo(customer, "customer"))

Comment obtenir la mise à jour

PyPI

Mettre à jour vers le dernier paquet via PyPI :

groupdocs-assembly-net 26.11.0

pip install groupdocs-assembly-net==26.11.0

Téléchargement direct

Téléchargez les wheels pour votre plateforme depuis la page GroupDocs.Assembly for Python v26.11.

Ressources