Nos complace anunciar el lanzamiento de GroupDocs.Assembly for Python v26.11, disponible a partir de noviembre de 2026. Esta versión ofrece importantes mejoras en el soporte de plataformas —incluyendo las primeras ruedas para Linux y macOS— junto con soporte nativo de fuentes de datos en Python, manejo de errores mejorado y dependencias actualizadas. También introduce varias características nuevas y cambios incompatibles para alinearse con las prácticas modernas de Python y .NET 10.

Qué hay de nuevo en esta versión

  • [Feature] Añadir ruedas para Linux x64 y macOS (Intel y Apple Silicon) (ASSEMBLYPYTHON-26)
  • [Feature] Añadir soporte para un dict o list de Python como fuente de datos (ASSEMBLYPYTHON-27)
  • [Feature] Añadir soporte para un manejador de Python de carga de tabla de documento (IDocumentTableLoadHandler) (ASSEMBLYPYTHON-28)
  • [Feature] Añadir soporte para tipos de Python donde la API recibe un .NET Type (DocumentTableColumn.type, known_types) (ASSEMBLYPYTHON-29)
  • [Feature] Añadir soporte para aplicar la licencia desde la variable de entorno GROUPDOCS_LIC_PATH (ASSEMBLYPYTHON-30)
  • [Enhancement] Actualizar GroupDocs.Assembly a 26.7 y el runtime incrustado a .NET 10.0.14 (ASSEMBLYPYTHON-31)
  • [Enhancement] Distribuir un paquete pure-Python para Python 3.5 – 3.14 en lugar de la extensión compilada (ASSEMBLYPYTHON-32)
  • [Enhancement] Aceptar un DataSourceInfo en assemble_document() así como una lista (ASSEMBLYPYTHON-33)
  • [Enhancement] Lanzar FileNotFoundError para un archivo faltante, LicenseError para una licencia que no se puede aplicar, y GroupDocsAssemblyException para otros errores del motor (ASSEMBLYPYTHON-34)
  • [Enhancement] Renombrar BarcodeSettings.x_resolution/y_resolution a xresolution/yresolution, y convertir use_reflection_optimization en un atributo de clase (ASSEMBLYPYTHON-35)
  • [Enhancement] Eliminar la rueda de Windows de 32 bits (ASSEMBLYPYTHON-36)
  • [Fix] Corregir hallazgos CVE en 25.5.1: zlib 1.2.11 → 1.2.12 (+4 más) (ASSEMBLYPYTHON-11)

Cambios en la API pública

Los usuarios que actualicen deben renombrar x_resolution/y_resolution y set_use_reflection_optimization(), y capturar GroupDocsAssemblyException y LicenseError donde antes capturaban RuntimeError. Todo lo demás es aditivo.

Nuevas clases y miembros

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

Renombrado

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

Los nombres antiguos generan AttributeError con una pista de “Did you mean”, al leer y al asignar.

Eliminado

  • DocumentAssembler.set_use_reflection_optimization(): asignar el atributo de clase en su lugar, DocumentAssembler.use_reflection_optimization = False.

Cambiado

  • DataSourceInfo acepta un dict o una lista.
  • assemble_document() acepta un DataSourceInfo así como una lista.
  • DocumentTableSet(path, load_handler) acepta una función de Python o un objeto con handle(args).
  • DocumentTableColumn.type y KnownTypeSet.add() aceptan un tipo de Python.
  • Los errores del motor generan FileNotFoundError, RuntimeError, LicenseError o GroupDocsAssemblyException. except Exception captura los errores de ambas versiones.

Nuevas características

Linux y macOS

26.11 tiene ruedas para Linux x64 (manylinux_2_27_x86_64, glibc 2.27 o superior) y para macOS 12 o superior en Intel (macosx_12_0_x86_64) y Apple Silicon (macosx_12_0_arm64), además de Windows x64. 25.5 solo tenía ruedas para Windows. pip 20.3 o superior selecciona la rueda para la plataforma. En Linux el runtime .NET necesita ICU, y las plantillas de presentación necesitan libgdiplus (ver Requisitos).

pip install groupdocs-assembly-net==26.11.0

Datos de Python como fuente de datos

DataSourceInfo acepta un dict, una lista de dicts o una lista de valores tal cual; 25.5 generó TypeError para un dict. El wrapper convierte los datos en objetos .NET tipados según su forma, de modo que números, cadenas, bool, datetime, date y valores Decimal llegan a la plantilla tipados: <<[o.OrderDate.Month]>> y <<if [c.Vip]>> funcionan como lo hacen con objetos .NET. Los dicts en una lista comparten un tipo con la unión de sus claves.

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 fuente de datos sin lista

assemble_document() acepta un DataSourceInfo o una lista de ellos, como lo hace params DataSourceInfo[] de .NET. 25.5 requería una lista y generó TypeError: can't build Array value from 'groupdocs.assembly.DataSourceInfo' para uno.

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

Manejadores de carga de tabla

DocumentTableSet(path, load_handler) acepta una función de Python (args), o un objeto con un método handle(args), y la llama para cada tabla del documento antes de cargarla. El manejador establece args.options de esa tabla, o omite la tabla con args.is_loaded = False; args.table_index indica cuál tabla es. 25.5 generó TypeError para una función de 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 de Python donde la API recibe un tipo .NET

Un tipo de Python representa el tipo .NET que un miembro acepta: float para System.Double, int, str, bool, datetime. Una columna de una tabla de documento puede hacerse numérica para que un gráfico la sume, y known_types permite que una plantilla llame a los miembros estáticos de un tipo; también acepta un nombre de tipo .NET. 25.5 generó 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"))

Licencia desde el entorno

Establezca GROUPDOCS_LIC_PATH a la ruta de un archivo de licencia, o a una URL que sirva una, y la licencia se aplicará en la primera llamada al motor, sin código de licencia; 25.5 no leía la variable. Si esa licencia no puede aplicarse (un archivo faltante, una suscripción expirada, una licencia para otro producto), cada llamada al motor genera LicenseError, nombrando la variable y la razón del motor, hasta que License().set_license() aplique una licencia. Establezca GROUPDOCS_LIC_STRICT=0 para obtener un LicenseWarning y modo de evaluación en su lugar.

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>

Errores por tipo

25.5 generaba un RuntimeError("Proxy error(<.NET exception>): ...") genérico para cada error del motor. 26.11 genera FileNotFoundError para una plantilla o archivo de datos faltante, que aún deriva de RuntimeError; RuntimeError con solo el mensaje del motor para un error de plantilla o un miembro que falta en los datos; LicenseError para una licencia que no se puede aplicar; y GroupDocsAssemblyException para los demás errores del motor. LicenseError y GroupDocsAssemblyException son importables desde groupdocs.assembly y no derivan 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)

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

Cómo obtener la actualización

PyPI

Actualice al paquete más reciente a través de PyPI:

groupdocs-assembly-net 26.11.0

pip install groupdocs-assembly-net==26.11.0

Descarga directa

Descargue las ruedas para su plataforma desde la página GroupDocs.Assembly for Python v26.11.

Recursos