Z przyjemnością ogłaszamy wydanie GroupDocs.Assembly for Python v26.11, dostępne od listopada 2026. To wydanie przynosi znaczące ulepszenia wsparcia platformy — w tym pierwsze pliki wheel dla systemów Linux i macOS — oraz natywne wsparcie źródła danych w Pythonie, ulepszoną obsługę błędów i zaktualizowane zależności. Wprowadza także kilka nowych funkcji oraz zmiany łamiące kompatybilność, aby dostosować się do nowoczesnych praktyk Pythona i .NET 10.

Co nowego w tym wydaniu

  • [Feature] Dodaj pliki wheel dla Linux x64 i macOS (Intel i Apple Silicon) (ASSEMBLYPYTHON-26)
  • [Feature] Dodaj wsparcie dla słownika lub listy Pythona jako źródła danych (ASSEMBLYPYTHON-27)
  • [Feature] Dodaj wsparcie dla obsługi ładowania tabeli dokumentu w Pythonie (IDocumentTableLoadHandler) (ASSEMBLYPYTHON-28)
  • [Feature] Dodaj wsparcie dla typów Pythona tam, gdzie API przyjmuje .NET Type (DocumentTableColumn.type, known_types) (ASSEMBLYPYTHON-29)
  • [Feature] Dodaj wsparcie dla stosowania licencji z zmiennej środowiskowej GROUPDOCS_LIC_PATH (ASSEMBLYPYTHON-30)
  • [Enhancement] Zaktualizuj GroupDocs.Assembly do wersji 26.7 oraz wbudowane środowisko uruchomieniowe do .NET 10.0.14 (ASSEMBLYPYTHON-31)
  • [Enhancement] Udostępnij pakiet czysto‑Pythonowy dla Pythona 3.5 – 3.14 zamiast skompilowanego rozszerzenia (ASSEMBLYPYTHON-32)
  • [Enhancement] Akceptuj pojedynczy DataSourceInfo w assemble_document() oraz listę (ASSEMBLYPYTHON-33)
  • [Enhancement] Rzuć FileNotFoundError przy brakującym pliku, LicenseError przy licencji, której nie można zastosować, oraz GroupDocsAssemblyException przy innych błędach silnika (ASSEMBLYPYTHON-34)
  • [Enhancement] Zmień nazwę BarcodeSettings.x_resolution/y_resolution na xresolution/yresolution oraz przekształć use_reflection_optimization w atrybut klasy (ASSEMBLYPYTHON-35)
  • [Enhancement] Usuń plik wheel dla 32‑bitowego Windowsa (ASSEMBLYPYTHON-36)
  • [Fix] Napraw wykryte CVE w wersji 25.5.1: zlib 1.2.11 → 1.2.12 (+4 kolejne) (ASSEMBLYPYTHON-11)

Zmiany w publicznym API

Użytkownicy aktualizujący muszą zmienić nazwę x_resolution/y_resolution oraz set_use_reflection_optimization(), i przechwytywać GroupDocsAssemblyException i LicenseError tam, gdzie wcześniej przechwytywano RuntimeError. Wszystko inne jest dodatkiem.

Nowe klasy i członkowie

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

Zmieniono nazwę

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

Stare nazwy powodują AttributeError z podpowiedzią „Czy miałeś na myśli”, przy odczycie i przy przypisaniu.

Usunięto

  • DocumentAssembler.set_use_reflection_optimization(): przypisz atrybut klasy zamiast tego, DocumentAssembler.use_reflection_optimization = False.

Zmieniono

  • DataSourceInfo przyjmuje słownik lub listę.
  • assemble_document() przyjmuje pojedynczy DataSourceInfo oraz listę.
  • DocumentTableSet(path, load_handler) przyjmuje funkcję Pythona lub obiekt z metodą handle(args).
  • DocumentTableColumn.type oraz KnownTypeSet.add() przyjmują typ Pythona.
  • Błędy silnika rzucają FileNotFoundError, RuntimeError, LicenseError lub GroupDocsAssemblyException. except Exception przechwytuje błędy obu wydań.

Nowe funkcje

Linux i macOS

26.11 posiada pliki wheel dla Linux x64 (manylinux_2_27_x86_64, glibc 2.27 lub nowszy) oraz dla macOS 12 lub nowszego na Intel (macosx_12_0_x86_64) i Apple Silicon (macosx_12_0_arm64), oprócz Windows x64. Wersja 25.5 miała tylko pliki wheel dla Windowsa. pip 20.3 lub nowszy wybiera odpowiedni wheel dla platformy. Na Linuxie środowisko .NET wymaga ICU, a szablony prezentacji potrzebują libgdiplus (zobacz Wymagania).

pip install groupdocs-assembly-net==26.11.0

Dane Pythona jako źródło danych

DataSourceInfo przyjmuje słownik, listę słowników lub listę wartości w takiej formie; wersja 25.5 podnosiła TypeError dla słownika. Wrapper konwertuje dane na obiekty .NET typowane na podstawie ich struktury, więc liczby, ciągi znaków, bool, datetime, date i wartości Decimal trafiają do szablonu w odpowiednich typach: <<[o.OrderDate.Month]>> i <<if [c.Vip]>> działają tak jak na obiektach .NET. Słowniki w jednej liście współdzielą jeden typ będący sumą ich kluczy.

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

Jedno źródło danych bez listy

assemble_document() przyjmuje pojedynczy DataSourceInfo lub listę takich obiektów, tak jak params DataSourceInfo[] w .NET. Wersja 25.5 wymagała listy i podnosiła TypeError: can't build Array value from 'groupdocs.assembly.DataSourceInfo' przy pojedynczym.

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

Obsługa ładowania tabel

DocumentTableSet(path, load_handler) przyjmuje funkcję Pythona (args), lub obiekt z metodą handle(args), i wywołuje ją dla każdej tabeli dokumentu przed jej załadowaniem. Obsługa ustawia args.options tej tabeli lub pomija tabelę ustawiając args.is_loaded = False; args.table_index wskazuje, która to tabela. Wersja 25.5 podnosiła TypeError dla funkcji Pythona.

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

Typy Pythona tam, gdzie API przyjmuje typ .NET

Typ Pythona reprezentuje typ .NET, którego wymaga członek: float dla System.Double, int, str, bool, datetime. Kolumna tabeli dokumentu może być ustawiona jako numeryczna, aby wykres mógł ją sumować, a known_types pozwala szablonowi wywoływać statyczne członki typu; przyjmuje także nazwę typu .NET. Wersja 25.5 podnosiła 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"))

Licencja ze środowiska

Ustaw GROUPDOCS_LIC_PATH na ścieżkę do pliku licencji lub na URL, z którego jest pobierana, a licencja zostanie zastosowana przy pierwszym wywołaniu silnika, bez kodu licencji; wersja 25.5 nie odczytywała tej zmiennej. Jeśli licencja nie może być zastosowana (brakujący plik, wygasła subskrypcja, licencja na inny produkt), każde wywołanie silnika podnosi LicenseError, podając nazwę zmiennej i przyczynę silnika, aż License().set_license() zastosuje licencję. Ustaw GROUPDOCS_LIC_STRICT=0, aby otrzymać jedno LicenseWarning i tryb ewaluacji zamiast tego.

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>

Błędy według rodzaju

Wersja 25.5 podnosiła surowy RuntimeError("Proxy error(<.NET exception>): ...") przy każdym błędzie silnika. 26.11 podnosi FileNotFoundError przy brakującym szablonie lub pliku danych, który nadal dziedziczy po RuntimeError; RuntimeError z samą wiadomością silnika przy błędzie szablonu lub brakującym elemencie danych; LicenseError przy licencji, której nie można zastosować; oraz GroupDocsAssemblyException przy innych błędach silnika. LicenseError i GroupDocsAssemblyException można importować z groupdocs.assembly i nie dziedziczą po 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)

Przykład kodu

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

Jak uzyskać aktualizację

PyPI

Zaktualizuj do najnowszego pakietu za pośrednictwem PyPI:

groupdocs-assembly-net 26.11.0

pip install groupdocs-assembly-net==26.11.0

Bezpośrednie pobranie

Pobierz pliki wheel dla swojej platformy ze strony GroupDocs.Assembly for Python v26.11.

Zasoby