Мы рады объявить о выпуске GroupDocs.Assembly for Python v26.11, доступном с ноября 2026 года. Этот релиз предоставляет значительные улучшения поддержки платформ — включая первые wheels для Linux и macOS — а также нативную поддержку источников данных Python, улучшенную обработку ошибок и обновлённые зависимости. Он также вводит несколько новых функций и несовместимых изменений, чтобы соответствовать современным практикам Python и .NET 10.

Что нового в этом релизе

  • [Feature] Добавить wheels для Linux x64 и macOS (Intel и Apple Silicon) (ASSEMBLYPYTHON-26)
  • [Feature] Добавить поддержку Python dict или list в качестве источника данных (ASSEMBLYPYTHON-27)
  • [Feature] Добавить поддержку обработчика загрузки таблицы документа на Python (IDocumentTableLoadHandler) (ASSEMBLYPYTHON-28)
  • [Feature] Добавить поддержку Python‑типов там, где API принимает .NET Type (DocumentTableColumn.type, known_types) (ASSEMBLYPYTHON-29)
  • [Feature] Добавить поддержку применения лицензии из переменной окружения GROUPDOCS_LIC_PATH (ASSEMBLYPYTHON-30)
  • [Enhancement] Обновить GroupDocs.Assembly до версии 26.7 и встроенный runtime до .NET 10.0.14 (ASSEMBLYPYTHON-31)
  • [Enhancement] Выпустить чисто‑Python пакет для Python 3.5 – 3.14 вместо скомпилированного расширения (ASSEMBLYPYTHON-32)
  • [Enhancement] Принять один DataSourceInfo в assemble_document() так же, как и список (ASSEMBLYPYTHON-33)
  • [Enhancement] Выбрасывать FileNotFoundError при отсутствии файла, LicenseError если лицензия не может быть применена, и GroupDocsAssemblyException для остальных ошибок движка (ASSEMBLYPYTHON-34)
  • [Enhancement] Переименовать BarcodeSettings.x_resolution/y_resolution в xresolution/yresolution и сделать use_reflection_optimization атрибутом класса (ASSEMBLYPYTHON-35)
  • [Enhancement] Удалить 32‑битный Windows‑wheel (ASSEMBLYPYTHON-36)
  • [Fix] Исправить уязвимости CVE в версии 25.5.1: zlib 1.2.11 → 1.2.12 (+4 других) (ASSEMBLYPYTHON-11)

Изменения публичного API

При обновлении необходимо переименовать x_resolution/y_resolution и set_use_reflection_optimization(), а также перехватывать GroupDocsAssemblyException и LicenseError там, где ранее перехватывали RuntimeError. Всё остальное добавляется.

Новые классы и члены

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

Переименовано

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

Старые имена вызывают AttributeError с подсказкой «Did you mean», как при чтении, так и при присваивании.

Удалено

  • DocumentAssembler.set_use_reflection_optimization(): вместо этого присвойте атрибут класса, DocumentAssembler.use_reflection_optimization = False.

Изменено

  • DataSourceInfo принимает dict или list.
  • assemble_document() принимает один DataSourceInfo, а также список.
  • DocumentTableSet(path, load_handler) принимает функцию Python или объект с методом handle(args).
  • DocumentTableColumn.type и KnownTypeSet.add() принимают Python‑тип.
  • Ошибки движка вызывают FileNotFoundError, RuntimeError, LicenseError или GroupDocsAssemblyException. except Exception перехватывает ошибки обеих версий.

Новые возможности

Linux и macOS

В версии 26.11 есть колёса для Linux x64 (manylinux_2_27_x86_64, glibc 2.27 или новее) и для macOS 12 и новее на Intel (macosx_12_0_x86_64) и Apple Silicon (macosx_12_0_arm64), а также для Windows x64. В версии 25.5 были только колёса для Windows. pip 20.3 или новее выбирает колесо для текущей платформы. На Linux runtime .NET требует ICU, а шаблоны презентаций требуют libgdiplus (см. Requirements).

pip install groupdocs-assembly-net==26.11.0

Данные Python в качестве источника данных

DataSourceInfo принимает dict, список dict‑ов или список значений как есть; в версии 25.5 для dict возникал TypeError. Обёртка преобразует данные в объекты .NET, типизированные по их структуре, поэтому числа, строки, bool, datetime, date и значения Decimal попадают в шаблон с типами: <<[o.OrderDate.Month]>> и <<if [c.Vip]>> работают так же, как на объектах .NET. Dict‑ы в одном списке используют один тип, объединяя их ключи.

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

Один источник данных без списка

assemble_document() принимает один DataSourceInfo или список таких объектов, как делает .NET params DataSourceInfo[]. В версии 25.5 требовался список и возникал TypeError: can't build Array value from 'groupdocs.assembly.DataSourceInfo' при передаче одного.

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

Обработчики загрузки таблиц

DocumentTableSet(path, load_handler) принимает функцию Python (args) или объект с методом handle(args) и вызывает её для каждой таблицы документа перед её загрузкой. Обработчик задаёт args.options для этой таблицы или пропускает таблицу, установив args.is_loaded = False; args.table_index указывает, какая это таблица. В версии 25.5 возникал TypeError для функции 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])

Python‑типы там, где API принимает .NET тип

Python‑тип представляет .NET‑тип, который принимает член: float соответствует System.Double, int, str, bool, datetime. Столбец таблицы документа можно сделать числовым, чтобы диаграмма суммировала его, а known_types позволяет шаблону вызывать статические члены типа; он также принимает имя .NET‑типа. В версии 25.5 возникал 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"))

Лицензия из переменной окружения

Установите GROUPDOCS_LIC_PATH в путь к файлу лицензии или в URL, откуда её можно получить, и лицензия будет применена при первом вызове движка, без кода лицензии; в версии 25.5 переменная не читалась. Если лицензия не может быть применена (отсутствующий файл, истёкшая подписка, лицензия для другого продукта), каждый вызов движка генерирует LicenseError, указывая переменную и причину движка, пока License().set_license() не применит лицензию. Установите GROUPDOCS_LIC_STRICT=0, чтобы получить одно LicenseWarning и режим оценки.

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>

Ошибки по типу

В версии 25.5 при любой ошибке движка возникал простой RuntimeError("Proxy error(<.NET exception>): ..."). В версии 26.11 генерируется FileNotFoundError при отсутствии шаблона или файла данных, который всё ещё наследуется от RuntimeError; RuntimeError с сообщением движка только для ошибки шаблона или отсутствующего члена данных; LicenseError для лицензии, которую нельзя применить; и GroupDocsAssemblyException для остальных ошибок движка. LicenseError и GroupDocsAssemblyException импортируются из groupdocs.assembly и не наследуются от 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)

Пример кода

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

Как получить обновление

PyPI

Обновите до последней версии пакета через PyPI:

groupdocs-assembly-net 26.11.0

pip install groupdocs-assembly-net==26.11.0

Прямое скачивание

Скачайте колёса для вашей платформы со страницы GroupDocs.Assembly for Python v26.11.

Ресурсы