ما خوشحالیم که انتشار GroupDocs.Assembly for Python v26.11 را اعلام می‌کنیم که از نوامبر 2026 در دسترس است. این نسخه بهبودهای عمده‌ای در پشتیبانی پلتفرم ارائه می‌دهد — از جمله اولین چرخ‌دنده‌ها (wheels) برای لینوکس و macOS — همراه با پشتیبانی بومی منبع داده پایتون، بهبود مدیریت خطاها و ارتقاء وابستگی‌ها. همچنین چندین ویژگی جدید و تغییرات شکسته‌کننده برای هم‌راستایی با شیوه‌های مدرن پایتون و .NET 10 معرفی می‌کند.

چه چیزهای جدیدی در این نسخه وجود دارد

  • [Feature] افزودن چرخ‌دنده‌ها برای Linux x64 و macOS (Intel و Apple Silicon) (ASSEMBLYPYTHON-26)
  • [Feature] پشتیبانی از یک دیکشنری یا لیست پایتون به عنوان منبع داده را اضافه کنید (ASSEMBLYPYTHON-27)
  • [Feature] پشتیبانی از یک هندلر پایتون برای بارگذاری جدول سند (IDocumentTableLoadHandler) را اضافه کنید (ASSEMBLYPYTHON-28)
  • [Feature] پشتیبانی از انواع پایتون در جایی که API یک .NET Type می‌گیرد (DocumentTableColumn.type، known_types) را اضافه کنید (ASSEMBLYPYTHON-29)
  • [Feature] پشتیبانی از اعمال لایسنس از متغیر محیطی GROUPDOCS_LIC_PATH را اضافه کنید (ASSEMBLYPYTHON-30)
  • [Enhancement] به‌روزرسانی GroupDocs.Assembly به نسخه 26.7 و زمان‌اجرای توکار به .NET 10.0.14 (ASSEMBLYPYTHON-31)
  • [Enhancement] ارائه یک بستهٔ خالص پایتون برای 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‑بیتی ویندوز (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 را با یک راهنمای «آیا منظور شما این بود» هنگام خواندن و اختصاص مقدار پرتاب می‌کنند.

حذف شده

  • DocumentAssembler.set_use_reflection_optimization(): به‌جای آن ویژگی کلاس را اختصاص دهید، DocumentAssembler.use_reflection_optimization = False.

تغییر یافته

  • DataSourceInfo می‌تواند یک دیکشنری یا یک لیست را بپذیرد.
  • assemble_document() یک DataSourceInfo یا یک لیست از آن‌ها را می‌پذیرد.
  • DocumentTableSet(path, load_handler) یک تابع پایتون یا یک شیء با متد handle(args) می‌گیرد.
  • DocumentTableColumn.type و KnownTypeSet.add() یک نوع پایتون می‌پذیرند.
  • خطاهای موتور FileNotFoundError، RuntimeError، LicenseError یا GroupDocsAssemblyException را پرتاب می‌کنند. except Exception خطاهای هر دو نسخه را می‌گیرد.

ویژگی‌های جدید

لینوکس و 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 فقط چرخ‌دنده‌های ویندوز داشت. pip نسخه 20.3 یا بالاتر چرخ‌دنده مناسب پلتفرم را انتخاب می‌کند. در لینوکس زمان‌اجرای .NET به ICU نیاز دارد و قالب‌های ارائه به libgdiplus نیاز دارند (به نیازمندی‌ها مراجعه کنید).

pip install groupdocs-assembly-net==26.11.0

داده‌های پایتون به عنوان منبع داده

DataSourceInfo یک دیکشنری، یک لیست از دیکشنری‌ها یا یک لیست از مقادیر را همان‌گونه می‌پذیرد؛ در نسخه 25.5 برای دیکشنری TypeError پرتاب می‌شد. بسته‌بند داده‌ها را به اشیای .NET تبدیل می‌کند که بر اساس ساختارشان نوع‌بندی شده‌اند، بنابراین اعداد، رشته‌ها، bool، datetime، date و مقادیر Decimal به قالب با نوع مناسب می‌رسند: <<[o.OrderDate.Month]>> و <<if [c.Vip]>> همان‌طور که در اشیای .NET عمل می‌کنند، کار می‌کنند. دیکشنری‌های موجود در یک لیست یک نوع مشترک با ترکیب کلیدهایشان دارند.

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) یک تابع پایتون (args) یا یک شیء با متد handle(args) می‌گیرد و برای هر جدول سند قبل از بارگذاری آن را فراخوانی می‌کند. هندلر args.options جدول را تنظیم می‌کند یا با args.is_loaded = False جدول را نادیده می‌گیرد؛ args.table_index نشان می‌دهد جدول کدام است. در نسخه 25.5 برای یک تابع پایتون TypeError پرتاب می‌شد.

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

انواع پایتون که API یک نوع .NET می‌گیرد

یک نوع پایتون نمایانگر نوع .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 دانلود کنید.

منابع