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

Що нового в цьому випуску

  • [Feature] Додати колеса для 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‑колесо (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 .NET runtime потребує ICU, а шаблони презентацій потребують libgdiplus (див. Requirements).

pip install groupdocs-assembly-net==26.11.0

Python-дані як джерело даних

DataSourceInfo приймає dict, список dict‑ів або список значень; у 25.5 виникала TypeError для dict. Обгортка перетворює дані у .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: таблиця, рядок якої <<foreach [o in orders]>><<[o.Number]>> ... <</foreach>> повторюється для кожного замовлення
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")  # шаблони можуть викликати <<[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.

Ресурси