ما خوشحالیم که انتشار GroupDocs.Merger for .NET v26.10 را اعلام می‌کنیم، که از اکتبر 2026 در دسترس است. این نسخه بهبودهای عمده‌ای برای کنترل بارگذاری منابع خارجی معرفی می‌کند، مشکلات بحرانی همزمانی در پردازش EPUB و TeX را برطرف می‌سازد، صفحه‌بندی EPUB را بهبود می‌بخشد، فرمت PDF و عنوان را در خروجی خود‑برچسب‌گذاری‌شده حفظ می‌کند و چندین خطای مرتبط با .NET Framework را رفع می‌کند. در مجموع شامل ۱۰ ویژگی، بهبود و رفع باگ است.

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

  • [Feature] به‌طور پیش‌فرض بارگذاری منابع خارجی را نادیده بگیرید، با لیست سفید مکان‌های مورد اعتماد و یک هندلر برای هر منبع
  • [Bug] رفع NullReferenceException برای اسناد EPUB که فایل فهرست مطالب آن پسوند .ncx ندارد
  • [Bug] رفع مشکل بارگذاری System.ValueTuple در پروژه‌های packages.config تحت .NET Framework هنگام ترکیب تصاویر
  • [Bug] رفع ترکیب اسناد SVG که در زمان‌های اجرایی .NET Framework 4.6.2 تا 4.7.0 شکست می‌خورد
  • [Bug] رندر صفحات EPUB با طرح ثابت به‌جای تقسیم هر صفحه به دو صفحه، یک صفحه برای هر صفحه کتاب باشد
  • [Bug] به‌روزرسانی System.Security.Cryptography.Pkcs به نسخه‌های 8.0.2 و 9.0.21 (CVE-2026-84008, CVE-2026-70162)
  • [Bug] حفظ فرمت PDF اصلی و عنوان هنگام ذخیره با فعال‌سازی auto‑tagging
  • [Bug] رفع ArgumentException هنگام بارگذاری همزمان اسناد TeX
  • [Bug] ذخیره خروجی LowCode که به‌صورت نام فایل ساده ارائه شده است در پوشه جاری و رد اسناد ترکیبی با فرمت متفاوت
  • [Bug] رفع خطاهای متناوب NullReferenceException یا IndexOutOfRangeException در اسناد EPUB هنگام پردازش همزمان

تغییرات API عمومی

1. منابع خارجی — به‌صورت پیش‌فرض رد می‌شوند (API جدید، ناسازگار با نسخه‌های قبلی)

انواع عمومی جدید در فضای نام GroupDocs.Merger.Domain.Options:

Type Description
IResourceLoadingOptions SkipExternalResources، WhitelistedResources و ExternalResourceHandler را تعریف می‌کند. LoadOptions اینترفیس را پیاده‌سازی می‌کند.
IExternalResourceHandler متد OnLoading برای هر منبع خارجی قبل از بارگذاری فراخوانی می‌شود و می‌تواند اجازه دهد، رد کند یا جایگزین کند.
ExternalResourceLoadingArgs منبعی که به OnLoading پاس داده می‌شود: Uri، Skipped (پیش‌تنظیم شده بر اساس تصمیم دو گزینه دیگر) و Data (محتوایی که به‌جای بارگذاری منبع استفاده می‌شود).

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

  • SkipExternalResources — به‌صورت پیش‌فرض در هر سازنده true است. وقتی true باشد، هیچ منبع خارجی‌ای بارگذاری نمی‌شود مگر آنهایی که با WhitelistedResources مطابقت داشته باشند یا توسط هندلر اجازه داده شوند.
  • WhitelistedResources — پیشوندهای URI مطلق منابعی که هنگام SkipExternalResources برابر true بارگذاری می‌شوند، برای مثال https://cdn.example.com/assets/ یا file:///C:/assets/. به‌صورت پیش‌فرض خالی است.
  • ExternalResourceHandler — به‌صورت پیش‌فرض null است.

تغییرات ناسازگار با نسخه‌های قبلی:

  • منابع خارجی دیگر به‌صورت پیش‌فرض بارگذاری نمی‌شوند. منابع ریموت (http، https، ftp و سایر طرح‌ها)، مسیرهای UNC، فایل‌های محلی، از جمله فایل‌های داخل پوشه سند، و ارجاعات نسبی که خارج از سند اشاره می‌کنند، نادیده گرفته می‌شوند و عملیات ادامه می‌یابد. نسخه‌های قبلی این منابع را بارگذاری می‌کردند. بنابراین ممکن است تصاویر و استایل‌شی‌ت‌های ریموت اسناد HTML، Word و ارائه در خروجی گم شوند و شمارش صفحات اسناد HTML و Word تغییر کند. محتویاتی که سند خود حمل می‌کند — URIهای data:، ارجاعات cid:، بخش‌های MHTML و رسانه‌های بسته‌بندی‌شده — همچنان بارگذاری می‌شوند. برای بارگذاری منابع خارجی، مکان‌هایشان را در لیست سفید بگذارید یا SkipExternalResources را برای اسنادی که به آن‌ها اعتماد دارید به false تنظیم کنید.
  • LoadOptions اکنون sealed است. کلاسی که از آن ارث‌بری کند دیگر کامپایل نمی‌شود. مستقیم از LoadOptions استفاده کنید یا ILoadOptions را پیاده‌سازی کنید؛ یک پیاده‌سازی سفارشی ILoadOptions که همچنین IResourceLoadingOptions را پیاده‌سازی نکند، سیاست پیش‌فرض را دریافت می‌کند.
  • ورودی WhitelistedResources که null، خالی، غیرمطلق، شامل query یا fragment باشد یا %2F، %5C یا %2E داشته باشد، سازنده Merger خطای ArgumentException می‌اندازد («منبع سفید شده ‘…’ باید یک URI مطلق بدون query، fragment یا کاراکترهای کدگذاری‌شده ‘/’, ‘\’ یا ‘.’ باشد.»).
  • اگر هندلر استثنا بیندازد، منبع نادیده گرفته می‌شود و عملیات خطای GroupDocsMergerException می‌اندازد («هندلر منبع خارجی استثنا اینداخت؛ منبع نادیده گرفته شد. برای جزئیات به استثنای داخلی نگاه کنید.») که استثنای هندلر به‌عنوان InnerException قرار می‌گیرد.
  • اسناد EPUB و اسناد SVG و SVGZ در برخی عملیات، اکنون مارکاپ آن‌ها برای ارجاعات خارجی بررسی می‌شود. سندی که مارکاپ آن XML صحیحی نباشد با GroupDocsMergerException شکست می‌خورد («مارکاپ سند قابل خواندن برای بررسی منابع خارجی نبود، بنابراین بارگذاری نشد. برای بارگذاری بدون بررسی SkipExternalResources را به false تنظیم کنید بدون ExternalResourceHandler. »).
  • سازنده‌های OleDiagramOptions، OleSpreadsheetOptions و OleWordProcessingOptions که مسیر فایل و شماره صفحه را می‌پذیرند، تصویر شیء جاسازی‌شده را با رد منابع خارجی رندر می‌کنند، صرف‌نظر از اینکه LoadOptions سند هدف چه اجازه‌ای بدهد. برای نمایش آن‌ها، داده تصویر خود را به سازنده‌ای که آن را می‌پذیرد، پاس دهید.
  • محصولات بسته GroupDocs.Merger.LowCode همیشه منابع خارجی را رد می‌کنند.

گزینه‌ها هنگام ایجاد Merger خوانده می‌شوند و اسنادی که به آن اضافه می‌شوند از گزینه‌های آن پیروی می‌کنند.

2. اسناد PDF خود‑برچسب‌گذاری‌شده فرمت و عنوان منبع را حفظ می‌کنند

بدون تغییر API. یک سند PDF که با PdfSaveOptions.AccesibilitySettings.EnableAutoTagging برابر true ذخیره شود، فرمت PDF و عنوان منبع را حفظ می‌کند. پیش‌تر هر سند خود‑برچسب‌گذاری‌شده به‌عنوان PDF/UA-1 علامت‌گذاری می‌شد و منبع بدون عنوان عنوان «Tagged PDF» می‌گرفت. خود‑برچسب‌گذاری فقط یک درخت ساختار منطقی اضافه می‌کند؛ باعث سازگاری PDF/UA نمی‌شود و منبعی که از پیش به‌عنوان PDF/UA علامت‌گذاری شده باشد، علامت خود را حفظ می‌کند.

3. اسناد EPUB با طرح ثابت — یک صفحه برای هر صفحه کتاب

بدون تغییر API. یک سند EPUB با طرح ثابت اکنون یک صفحه برای هر صفحه کتاب دارد. پیش‌تر هر صفحه کتاب به‌صورت دو صفحه رندر می‌شد، به‌طوری که GetDocumentInfo تعداد صفحات را دو برابر گزارش می‌داد و صفحه N با صفحه کتاب N مطابقت نداشت. شماره‌های صفحه‌ای که به عملیات‌های صفحه‌ای مانند ExtractPages، RemovePages یا Split پاس داده می‌شوند، اکنون به صفحات کتاب اشاره دارند.

4. GroupDocs.Merger.LowCode — مسیر خروجی و اسناد ترکیبی

  • JoinPdf، JoinDocx، JoinPptx و RemovePagesPdf مسیر خروجی نسبی را نسبت به پوشه کاری جاری حل می‌کنند. مسیر خروجی که به‌صورت نام فایل ساده داده شود، اکنون در پوشه جاری ذخیره می‌شود؛ پیش‌تر در پوشه خروجی پیش‌فرض Merger ذخیره می‌شد. مسیر خروجی null یا خالی خطای ArgumentNullException می‌اندازد.
  • JoinPdf، JoinDocx و JoinPptx هنگامیکه پسوند سند ترکیبی با فرمت محصول مطابقت نداشته باشد، قبل از نوشتن هر خروجی، FileTypeNotSupportedException می‌اندازند، برای مثال «فرمت ورودی با فرمت مورد انتظار ‘PDF’ مطابقت ندارد؛ فایل ترکیبی ‘a.docx’ ‘Microsoft Word Open XML Document (.docx)’ است.» پیش‌تر JoinPdf و JoinDocx خروجی ترکیبی تولید می‌کردند و JoinPptx بعداً با پیام دیگری شکست می‌خورد. مسیر سند ترکیبی null یا خالی خطای ArgumentNullException می‌اندازد («سند در ایندکس 0 خالی یا null است.»).
  • تمام هفت محصول FileTypeNotSupportedException («فرمت ورودی با فرمت مورد انتظار ‘PDF’ مطابقت ندارد؛ فایل ارائه‌شده ‘Unknown’ است.») را برای مسیر منبع بدون پسوند انداخته‌اند، به‌جای ArgumentException.

5. وابستگی‌ها

  • بسته‌های زمان اجرا به System.Security.Cryptography.Pkcs نسخه 8.0.2 (GroupDocs.Merger.Net60، GroupDocs.Merger.Net80 و بسته‌های .Windows آن) یا 9.0.21 (GroupDocs.Merger.Net100 و GroupDocs.Merger.Net100.Windows) وابسته‌اند. GroupDocs.Merger.Net60، GroupDocs.Merger.Net60.Windows و GroupDocs.Merger.LowCode همچنین به System.Formats.Asn1 نسخه 8.0.2 وابسته‌اند، و GroupDocs.Merger.LowCode به System.Security.Cryptography.Pkcs نسخه 8.0.2 وابسته است. GroupDocs.Merger.Net462 بدون تغییر باقی مانده است.
  • در پروژه‌های .NET Framework، بسته GroupDocs.Merger دیگر ریدایرکت بایندینگ برای System.ValueTuple را به app.config یا web.config (پروژه‌های packages.config) اضافه نمی‌کند و هدف‌های ساخت .NET Framework آن DependsOnNETStandard را به true تنظیم می‌کنند مگر اینکه پروژه این مقدار را تنظیم کرده باشد.

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

  • کنترل منابع خارجی: تصاویر، استایل‌شی‌ت‌ها، تصاویر پیوندی و سایر فایل‌هایی که سند به آن‌ها ارجاع می‌دهد، دیگر مگر آنکه اجازه داده شوند، بارگذاری نمی‌شوند. LoadOptions دارای ویژگی‌های جدید SkipExternalResources، WhitelistedResources و ExternalResourceHandler است تا مکان‌های مورد اعتماد را اجازه دهید، برای اسنادی که به آن‌ها اعتماد دارید همه چیز را بگذارید، یا هر منبع را در کد خود تصمیم‌گیری، رد یا جایگزین کنید.
  • رفع مشکلات همزمانی: اسناد EPUB دیگر به‌صورت متناوب با NullReferenceException یا IndexOutOfRangeException شکست نمی‌خورند و اسناد TeX دیگر با ArgumentException هنگام پردازش از چندین رشته مواجه نمی‌شوند.
  • اسناد EPUB: اسناد EPUB با طرح ثابت اکنون یک صفحه برای هر صفحه کتاب دارند، بنابراین صفحه N صفحه کتاب N است. اسنادی که فایل فهرست مطالبشان پسوندی غیر از .ncx دارد، دیگر با NullReferenceException شکست نمی‌خورند.
  • خروجی PDF خود‑برچسب‌گذاری‌شده: سند PDF ذخیره‌شده با فعال‌سازی خود‑برچسب‌گذاری، فرمت و عنوان منبع را حفظ می‌کند. دیگر به‌صورت خودکار به PDF/UA-1 علامت‌گذاری نمی‌شود مگر اینکه منبع اصلی این‌گونه باشد و منبع بدون عنوان دیگر عنوان «Tagged PDF» نمی‌گیرد.
  • پروژه‌های .NET Framework: ترکیب تصاویر در پروژه‌های packages.config دیگر به‌دلیل عدم بارگذاری System.ValueTuple شکست نمی‌خورد و ترکیب اسناد SVG دیگر به‌دلیل بارگذاری netstandard در زمان‌های اجرایی .NET Framework 4.6.2 تا 4.7.0 شکست نمی‌خورد.
  • وابستگی اصلاح‌شده: بسته‌ها به System.Security.Cryptography.Pkcs نسخه 8.0.2 (.NET 6.0 و .NET 8.0) یا 9.0.21 (.NET 10.0) وابسته‌اند، نسخه‌هایی که CVE-2026-84008 و CVE-2026-70162 را رفع می‌کنند.
  • محصولات LowCode: مسیر خروجی که به‌صورت نام فایل ساده داده شود، در پوشه جاری ذخیره می‌شود و JoinPdf، JoinDocx و JoinPptx قبل از نوشتن هر خروجی، سند ترکیبی با فرمت متفاوت را رد می‌کنند.

مثال کد

using System.Collections.Generic;
using GroupDocs.Merger;
using GroupDocs.Merger.Domain;
using GroupDocs.Merger.Domain.Options;

var loadOptions = new LoadOptions(FileType.HTML)
{
    // Load resources from one trusted folder only; everything else stays denied
    WhitelistedResources = new List<string> { "https://cdn.example.com/assets/" }
};

using (var merger = new Merger("page1.html", loadOptions))
{
    merger.Join("page2.html");
    merger.Save("merged.html");
}
using System;
using GroupDocs.Merger.Domain.Options;

public class TrustedPngHandler : IExternalResourceHandler
{
    public void OnLoading(ExternalResourceLoadingArgs args)
    {
        Uri uri;
        if (Uri.TryCreate(args.Uri, UriKind.Absolute, out uri)
            && uri.Scheme == Uri.UriSchemeHttps
            && uri.Host == "cdn.example.com"
            && uri.AbsolutePath.EndsWith(".png", StringComparison.OrdinalIgnoreCase))
        {
            args.Skipped = false;   // allow; any other resource keeps the default decision
        }
    }
}

نحوه دریافت به‌روزرسانی

NuGet

به‌روزرسانی به آخرین بسته GroupDocs.Merger از طریق NuGet: GroupDocs.Merger 26.10.0

dotnet add package GroupDocs.Merger --version 26.10.0

دانلود مستقیم

دستگاه‌های اجرایی را از صفحه GroupDocs.Merger for .NET 26.10 دریافت کنید.

منابع