Estamos felizes em anunciar o lançamento do GroupDocs.Assembly for Python v26.11, disponível a partir de novembro de 2026. Esta versão oferece melhorias significativas no suporte a plataformas — incluindo as primeiras wheels para Linux e macOS — juntamente com suporte nativo a fontes de dados Python, tratamento de erros aprimorado e dependências atualizadas. Também introduz vários novos recursos e mudanças incompatíveis para alinhar‑se às práticas modernas de Python e .NET 10.

O que há de novo nesta versão

  • [Feature] Adicionar wheels para Linux x64 e macOS (Intel e Apple Silicon) (ASSEMBLYPYTHON-26)
  • [Feature] Adicionar suporte a um dict ou list Python como fonte de dados (ASSEMBLYPYTHON-27)
  • [Feature] Adicionar suporte a um manipulador Python de carregamento de tabela de documento (IDocumentTableLoadHandler) (ASSEMBLYPYTHON-28)
  • [Feature] Adicionar suporte a tipos Python onde a API aceita um .NET Type (DocumentTableColumn.type, known_types) (ASSEMBLYPYTHON-29)
  • [Feature] Adicionar suporte à aplicação da licença a partir da variável de ambiente GROUPDOCS_LIC_PATH (ASSEMBLYPYTHON-30)
  • [Enhancement] Atualizar GroupDocs.Assembly para 26.7 e o runtime incorporado para .NET 10.0.14 (ASSEMBLYPYTHON-31)
  • [Enhancement] Distribuir um pacote pure-Python para Python 3.5 – 3.14 em vez da extensão compilada (ASSEMBLYPYTHON-32)
  • [Enhancement] Aceitar um DataSourceInfo em assemble_document() assim como uma lista (ASSEMBLYPYTHON-33)
  • [Enhancement] Lançar FileNotFoundError para um arquivo ausente, LicenseError para uma licença que não pode ser aplicada e GroupDocsAssemblyException para outros erros do engine (ASSEMBLYPYTHON-34)
  • [Enhancement] Renomear BarcodeSettings.x_resolution/y_resolution para xresolution/yresolution e tornar use_reflection_optimization um atributo de classe (ASSEMBLYPYTHON-35)
  • [Enhancement] Remover a wheel Windows de 32 bits (ASSEMBLYPYTHON-36)
  • [Fix] Corrigir vulnerabilidades CVE em 25.5.1: zlib 1.2.11 → 1.2.12 (+4 mais) (ASSEMBLYPYTHON-11)

Alterações na API Pública

Quem atualiza precisa renomear x_resolution/y_resolution e set_use_reflection_optimization(), e capturar GroupDocsAssemblyException e LicenseError onde antes capturavam RuntimeError. Todo o resto é aditivo.

Novas classes e membros

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

Renomeado

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

Os nomes antigos lançam AttributeError com uma dica “Você quis dizer”, tanto na leitura quanto na atribuição.

Removido

  • DocumentAssembler.set_use_reflection_optimization(): atribua o atributo de classe em vez disso, DocumentAssembler.use_reflection_optimization = False.

Alterado

  • DataSourceInfo aceita um dict ou uma lista.
  • assemble_document() aceita um DataSourceInfo ou uma lista.
  • DocumentTableSet(path, load_handler) aceita uma função Python ou um objeto com handle(args).
  • DocumentTableColumn.type e KnownTypeSet.add() aceitam um tipo Python.
  • Erros do engine lançam FileNotFoundError, RuntimeError, LicenseError ou GroupDocsAssemblyException. except Exception captura os erros de ambas as versões.

Novos recursos

Linux e macOS

26.11 tem wheels para Linux x64 (manylinux_2_27_x86_64, glibc 2.27 ou mais recente) e para macOS 12 ou mais recente em Intel (macosx_12_0_x86_64) e Apple Silicon (macosx_12_0_arm64), além do Windows x64. 25.5 tinha apenas wheels para Windows. pip 20.3 ou mais recente seleciona a wheel para a plataforma. No Linux o runtime .NET precisa de ICU, e os modelos de apresentação precisam de libgdiplus (veja Requisitos).

pip install groupdocs-assembly-net==26.11.0

Dados Python como fonte de dados

DataSourceInfo aceita um dict, uma lista de dicts ou uma lista de valores como está; 25.5 gerava TypeError para um dict. O wrapper converte os dados em objetos .NET tipados a partir de sua estrutura, de modo que números, strings, bool, datetime, date e valores Decimal chegam ao modelo tipados: <<[o.OrderDate.Month]>> e <<if [c.Vip]>> funcionam como fazem em objetos .NET. Dicts em uma lista compartilham um tipo com a união de suas chaves.

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

Uma fonte de dados sem lista

assemble_document() aceita um DataSourceInfo ou uma lista deles, como faz o params DataSourceInfo[] do .NET. 25.5 exigia uma lista e gerava TypeError: can't build Array value from 'groupdocs.assembly.DataSourceInfo' para um único.

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

Manipuladores de carregamento de tabela

DocumentTableSet(path, load_handler) aceita uma função Python (args), ou um objeto com um método handle(args), e a chama para cada tabela do documento antes de carregá‑la. O manipulador define args.options dessa tabela, ou pula a tabela com args.is_loaded = False; args.table_index indica qual tabela é. 25.5 gerava TypeError para uma função 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])

Tipos Python onde a API aceita um tipo .NET

Um tipo Python representa o tipo .NET que um membro aceita: float para System.Double, int, str, bool, datetime. Uma coluna de uma tabela de documento pode ser tornada numérica para que um gráfico a some, e known_types permite que um modelo chame membros estáticos de um tipo; também aceita um nome de tipo .NET. 25.5 gerava 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"))

Licença a partir do ambiente

Defina GROUPDOCS_LIC_PATH para o caminho de um arquivo de licença, ou para uma URL que sirva um, e a licença será aplicada na primeira chamada do engine, sem código de licença; 25.5 não lia a variável. Se essa licença não puder ser aplicada (arquivo ausente, assinatura expirada, licença para outro produto), toda chamada do engine lança LicenseError, nomeando a variável e o motivo do engine, até que License().set_license() aplique uma licença. Defina GROUPDOCS_LIC_STRICT=0 para obter um LicenseWarning e modo de avaliação em vez disso.

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>

Erros por tipo

25.5 gerava um RuntimeError("Proxy error(<.NET exception>): ...") genérico para cada erro do engine. 26.11 lança FileNotFoundError para um modelo ou arquivo de dados ausente, que ainda deriva de RuntimeError; RuntimeError com apenas a mensagem do engine para um erro de modelo ou um membro que os dados não possuem; LicenseError para uma licença que não pode ser aplicada; e GroupDocsAssemblyException para os outros erros do engine. LicenseError e GroupDocsAssemblyException podem ser importados de groupdocs.assembly e não derivam 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)

Exemplo de código

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

Como obter a atualização

PyPI

Atualize para o pacote mais recente via PyPI:

groupdocs-assembly-net 26.11.0

pip install groupdocs-assembly-net==26.11.0

Download direto

Baixe as wheels para sua plataforma na página GroupDocs.Assembly for Python v26.11.

Recursos