Ми раді оголосити про випуск GroupDocs.Merger for .NET v26.10, доступний з жовтня 2026. Цей випуск впроваджує суттєві покращення контролю завантаження зовнішніх ресурсів, вирішує критичні проблеми конкурентності при обробці EPUB та TeX, покращує пагінацію EPUB, зберігає формат PDF та заголовок у автоматично тегованому виводі, а також виправляє кілька збоїв, пов’язаних з .NET Framework. Всього включено 10 функцій, покращень та виправлень помилок.

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

  • [Feature] Пропускати завантаження зовнішніх ресурсів за замовчуванням, з білим списком довірених розташувань та обробником для кожного ресурсу
  • [Bug] Виправити NullReferenceException для EPUB‑документів, у яких файл змісту не має розширення .ncx
  • [Bug] Виправити збої при об’єднанні зображень, які не завантажують System.ValueTuple у проектах .NET Framework packages.config
  • [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 та заголовок при збереженні з увімкненим авто‑тегуванням
  • [Bug] Виправити ArgumentException під час одночасного завантаження TeX‑документів
  • [Bug] Зберігати вихід LowCode, заданий лише іменем файлу, у поточному каталозі та відхиляти об’єднані документи іншого формату
  • [Bug] Виправити випадкові NullReferenceException або IndexOutOfRangeException у EPUB‑документах при одночасній обробці

Зміни у публічному API

1. Зовнішні ресурси — заборонені за замовчуванням (новий API, несумісний назад)

Нові публічні типи у просторі імен GroupDocs.Merger.Domain.Options:

Тип Опис
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 може змінитися. Вміст, який вже міститься у документі — data: URI, cid: посилання, частини MHTML та упаковані медіа — все ще завантажуються. Щоб завантажити зовнішні ресурси, додайте їх розташування до білого списку або встановіть SkipExternalResources у false для довірених документів.
  • LoadOptions тепер sealed. Клас, що успадковується від нього, більше не компілюється. Використовуйте LoadOptions безпосередньо або реалізуйте ILoadOptions; власна реалізація ILoadOptions, яка не реалізує також IResourceLoadingOptions, отримує політику за замовчуванням.
  • Запис WhitelistedResources, який є null, порожнім, не є абсолютним URI, містить запит або фрагмент, або містить %2F, %5C чи %2E, викликає в конструкторі Merger виняток ArgumentException («Whitelisted resource ‘…’ must be an absolute URI without a query, fragment or encoded ‘/’, ‘\’ or ‘.’.»).
  • Якщо обробник викидає виключення, ресурс пропускається, і операція викидає GroupDocsMergerException («The external resource handler threw an exception; the resource was skipped. See the inner exception.») з виключенням обробника у властивості InnerException.
  • EPUB‑документи, а також SVG та SVGZ у деяких операціях, тепер перевіряються на зовнішні посилання. Документ, у якому розмітка не є коректним XML, завершується з GroupDocsMergerException («The document’s markup could not be read to check it for external resources, so it was not loaded. Set SkipExternalResources to false without an ExternalResourceHandler to load it without the check.»).
  • Конструктори 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, коли розширення об’єднаного документа не відповідає формату продукту, ще до запису будь‑якого виводу, наприклад «Input format does not match the expected format ‘PDF’; the joined file ‘a.docx’ is ‘Microsoft Word Open XML Document (.docx)’». Раніше JoinPdf і JoinDocx створювали змішаний вивід, а JoinPptx падало пізніше з іншим повідомленням. null або порожній шлях до об’єднаного документа викликає ArgumentNullException («The document at index 0 is null or empty.»).
  • Усі сім продуктів викидають FileTypeNotSupportedException («Input format does not match the expected format ‘PDF’; the supplied file is ‘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. EPUB‑документи, у яких файл змісту має інше розширення, ніж .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.

Ресурси