Ми раді оголосити про випуск 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.