Siamo felici di annunciare il rilascio di GroupDocs.Assembly for Python v26.11, disponibile a partire da novembre 2026. Questa versione offre importanti miglioramenti del supporto della piattaforma — inclusi i primi wheel per Linux e macOS — insieme al supporto nativo delle sorgenti dati Python, una gestione degli errori migliorata e dipendenze aggiornate. Introduce inoltre diverse nuove funzionalità e modifiche incompatibili per allinearsi alle pratiche Python moderne e a .NET 10.

Novità di questa versione

  • [Feature] Aggiungi wheel per Linux x64 e macOS (Intel e Apple Silicon) (ASSEMBLYPYTHON-26)
  • [Feature] Aggiungi supporto per un dict o una lista Python come sorgente dati (ASSEMBLYPYTHON-27)
  • [Feature] Aggiungi supporto per un gestore Python del caricamento delle tabelle del documento (IDocumentTableLoadHandler) (ASSEMBLYPYTHON-28)
  • [Feature] Aggiungi supporto per tipi Python dove l’API richiede un .NET Type (DocumentTableColumn.type, known_types) (ASSEMBLYPYTHON-29)
  • [Feature] Aggiungi supporto per applicare la licenza dalla variabile d’ambiente GROUPDOCS_LIC_PATH (ASSEMBLYPYTHON-30)
  • [Enhancement] Aggiorna GroupDocs.Assembly a 26.7 e il runtime incorporato a .NET 10.0.14 (ASSEMBLYPYTHON-31)
  • [Enhancement] Distribuisci un pacchetto pure-Python per Python 3.5 – 3.14 al posto dell’estensione compilata (ASSEMBLYPYTHON-32)
  • [Enhancement] Accetta un DataSourceInfo in assemble_document() così come una lista (ASSEMBLYPYTHON-33)
  • [Enhancement] Genera FileNotFoundError per un file mancante, LicenseError per una licenza che non può essere applicata e GroupDocsAssemblyException per altri errori del motore (ASSEMBLYPYTHON-34)
  • [Enhancement] Rinomina BarcodeSettings.x_resolution/y_resolution in xresolution/yresolution e rendi use_reflection_optimization un attributo di classe (ASSEMBLYPYTHON-35)
  • [Enhancement] Rimuovi il wheel Windows a 32-bit (ASSEMBLYPYTHON-36)
  • [Fix] Correggi le vulnerabilità CVE in 25.5.1: zlib 1.2.11 → 1.2.12 (+4 altri) (ASSEMBLYPYTHON-11)

Modifiche all’API pubblica

Gli aggiornatori devono rinominare x_resolution/y_resolution e set_use_reflection_optimization(), e catturare GroupDocsAssemblyException e LicenseError dove prima catturavano RuntimeError. Tutto il resto è aggiuntivo.

Nuove classi e membri

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

Rinominate

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

I vecchi nomi generano AttributeError con un suggerimento “Intendevi dire”, sia in lettura che in assegnazione.

Rimosse

  • DocumentAssembler.set_use_reflection_optimization(): assegna l’attributo di classe invece, DocumentAssembler.use_reflection_optimization = False.

Modificate

  • DataSourceInfo accetta un dict o una lista.
  • assemble_document() accetta un DataSourceInfo così come una lista.
  • DocumentTableSet(path, load_handler) accetta una funzione Python o un oggetto con handle(args).
  • DocumentTableColumn.type e KnownTypeSet.add() accettano un tipo Python.
  • Gli errori del motore generano FileNotFoundError, RuntimeError, LicenseError o GroupDocsAssemblyException. except Exception cattura gli errori di entrambe le versioni.

Nuove funzionalità

Linux e macOS

26.11 ha wheel per Linux x64 (manylinux_2_27_x86_64, glibc 2.27 o superiore) e per macOS 12 o superiore su Intel (macosx_12_0_x86_64) e Apple Silicon (macosx_12_0_arm64), oltre a Windows x64. 25.5 aveva solo wheel per Windows. pip 20.3 o superiore seleziona il wheel per la piattaforma. Su Linux il runtime .NET richiede ICU, e i template di presentazione richiedono libgdiplus (vedi Requirements).

pip install groupdocs-assembly-net==26.11.0

Dati Python come sorgente dati

DataSourceInfo accetta un dict, una lista di dict o una lista di valori così com’è; 25.5 generava TypeError per un dict. Il wrapper converte i dati in oggetti .NET tipizzati in base alla loro forma, quindi numeri, stringhe, bool, datetime, date e valori Decimal arrivano al template tipizzati: <<[o.OrderDate.Month]>> e <<if [c.Vip]>> funzionano come su oggetti .NET. I dict in una lista condividono un unico tipo con l’unione delle loro chiavi.

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"),
])

Una sorgente dati senza lista

assemble_document() accetta un DataSourceInfo o una lista di essi, come fa params DataSourceInfo[] di .NET. 25.5 richiedeva una lista e generava TypeError: can't build Array value from 'groupdocs.assembly.DataSourceInfo' per un singolo.

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"))

Gestori di caricamento delle tabelle

DocumentTableSet(path, load_handler) accetta una funzione Python (args), o un oggetto con un metodo handle(args), e la chiama per ogni tabella del documento prima del caricamento. Il gestore imposta args.options per quella tabella, o salta la tabella con args.is_loaded = False; args.table_index indica quale tabella è. 25.5 generava TypeError per una funzione 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])

Tipi Python dove l’API richiede un tipo .NET

Un tipo Python rappresenta il tipo .NET che un membro accetta: float per System.Double, int, str, bool, datetime. Una colonna di una tabella del documento può essere resa numerica così un grafico la somma, e known_types consente a un template di chiamare i membri statici di un tipo; accetta anche un nome di tipo .NET. 25.5 generava 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"))

Licenza dall’ambiente

Imposta GROUPDOCS_LIC_PATH sul percorso di un file di licenza, o su un URL che ne fornisce uno, e la licenza viene applicata alla prima chiamata del motore, senza codice di licenza; 25.5 non leggeva la variabile. Se quella licenza non può essere applicata (file mancante, abbonamento scaduto, licenza per un altro prodotto), ogni chiamata del motore genera LicenseError, indicando la variabile e il motivo del motore, fino a quando License().set_license() applica una licenza. Imposta GROUPDOCS_LIC_STRICT=0 per ottenere un LicenseWarning e la modalità di valutazione invece.

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>

Errori per tipo

25.5 generava un semplice RuntimeError("Proxy error(<.NET exception>): ...") per ogni errore del motore. 26.11 genera FileNotFoundError per un template o file dati mancante, che deriva ancora da RuntimeError; RuntimeError con solo il messaggio del motore per un errore di template o un membro mancante nei dati; LicenseError per una licenza che non può essere applicata; e GroupDocsAssemblyException per gli altri errori del motore. LicenseError e GroupDocsAssemblyException sono importabili da groupdocs.assembly e non derivano da 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)

Esempio di codice

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"))

Come ottenere l’aggiornamento

PyPI

Aggiorna all’ultimo pacchetto tramite PyPI:

groupdocs-assembly-net 26.11.0

pip install groupdocs-assembly-net==26.11.0

Download diretto

Scarica i wheel per la tua piattaforma dalla pagina GroupDocs.Assembly for Python v26.11.

Risorse