Nous sommes heureux d’annoncer la sortie de GroupDocs.Merger for .NET v26.10, disponible depuis octobre 2026. Cette version introduit d’importantes améliorations pour le contrôle du chargement des ressources externes, résout des problèmes critiques de concurrence lors du traitement des documents EPUB et TeX, améliore la pagination des EPUB, préserve le format PDF et le titre dans la sortie auto‑étiquetée, et corrige plusieurs échecs liés à .NET Framework. Au total, elle comprend 10 fonctionnalités, améliorations et corrections de bugs.

Nouveautés de cette version

  • [Feature] Passer le chargement des ressources externes par défaut, avec une liste blanche d’emplacements de confiance et un gestionnaire par ressource
  • [Bug] Corriger NullReferenceException pour les documents EPUB dont le fichier de table des matières n’a pas l’extension .ncx
  • [Bug] Corriger les jointures d’images qui échouaient à charger System.ValueTuple dans les projets .NET Framework packages.config
  • [Bug] Corriger les jointures avec des documents SVG qui échouaient sur les runtimes .NET Framework 4.6.2 à 4.7.0
  • [Bug] Rendre les pages EPUB à mise en page fixe une par page de livre au lieu de les diviser en deux
  • [Bug] Mettre à jour System.Security.Cryptography.Pkcs vers 8.0.2 et 9.0.21 (CVE‑2026‑84008, CVE‑2026‑70162)
  • [Bug] Conserver le format PDF original et le titre lors de l’enregistrement avec l’auto‑étiquetage activé
  • [Bug] Corriger une ArgumentException lorsque des documents TeX sont chargés simultanément
  • [Bug] Enregistrer la sortie LowCode donnée sous forme de nom de fichier seul dans le répertoire courant et rejeter les documents joints d’un autre format
  • [Bug] Corriger les documents EPUB qui échouaient de façon intermittente avec NullReferenceException ou IndexOutOfRangeException lorsqu’ils étaient traités simultanément

Modifications de l’API publique

1. Ressources externes — refusées par défaut (nouvelle API, incompatibilité ascendante)

Nouveaux types publics dans l’espace de noms GroupDocs.Merger.Domain.Options :

Type Description
IResourceLoadingOptions Définit SkipExternalResources, WhitelistedResources et ExternalResourceHandler. LoadOptions l’implémente.
IExternalResourceHandler Sa méthode OnLoading est appelée pour chaque ressource externe avant son chargement et peut l’autoriser, la sauter ou la remplacer.
ExternalResourceLoadingArgs La ressource transmise à OnLoading : Uri, Skipped (pré‑déterminé selon les deux autres options) et Data (contenu à utiliser à la place du chargement de la ressource).

Nouvelles propriétés de LoadOptions :

  • SkipExternalResources — true par défaut dans chaque constructeur. Tant que true, aucune ressource externe n’est chargée sauf celles correspondant à WhitelistedResources ou autorisées par le gestionnaire.
  • WhitelistedResources — préfixes d’URI absolus des ressources qui sont chargées lorsque SkipExternalResources est true, par exemple https://cdn.example.com/assets/ ou file:///C:/assets/. Vide par défaut.
  • ExternalResourceHandler — null par défaut.

Modifications incompatibles :

  • Les ressources externes ne sont plus chargées par défaut. Les ressources distantes (http, https, ftp et autres schémas), les chemins UNC, les fichiers locaux, y compris ceux du dossier du document, et les références relatives pointant en dehors du document sont ignorés, et l’opération se poursuit. Les versions antérieures les chargeaient. Les images et feuilles de style distantes des documents HTML, Word et de présentation peuvent donc manquer dans la sortie, et le nombre de pages des documents HTML et Word peut changer. Le contenu intégré au document — URI data:, références cid:, parties MHTML et médias empaquetés — continue d’être chargé. Pour charger des ressources externes, ajoutez leurs emplacements à la liste blanche ou définissez SkipExternalResources sur false pour les documents de confiance.
  • LoadOptions est maintenant sealed. Une classe dérivée ne compile plus. Utilisez directement LoadOptions, ou implémentez ILoadOptions ; une implémentation personnalisée de ILoadOptions qui n’implémente pas également IResourceLoadingOptions obtient la politique par défaut.
  • Une entrée WhitelistedResources qui est nulle, vide, qui n’est pas une URI absolue, qui comporte une requête ou un fragment, ou qui contient %2F, %5C ou %2E provoque le lancement d’une ArgumentException par le constructeur Merger (« Whitelisted resource ‘…’ must be an absolute URI without a query, fragment or encoded ‘/’, ‘\’ or ‘.’. »).
  • Si le gestionnaire lève une exception, la ressource est ignorée et l’opération lève GroupDocsMergerException (« The external resource handler threw an exception; the resource was skipped. See the inner exception. ») avec l’exception du gestionnaire comme InnerException.
  • Les documents EPUB, ainsi que les documents SVG et SVGZ dans certaines opérations, font désormais l’objet d’une vérification de leur balisage pour des références externes. Un document dont le balisage n’est pas du XML bien formé échoue avec 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. `).
  • Les constructeurs OleDiagramOptions, OleSpreadsheetOptions et OleWordProcessingOptions qui prennent un chemin de fichier et un numéro de page rendent l’image de l’objet incorporé avec les ressources externes refusées, quel que soit le LoadOptions du document cible. Pour les afficher, transmettez vos propres données d’image au constructeur qui les accepte.
  • Les produits du package GroupDocs.Merger.LowCode refusent toujours les ressources externes.

Les options sont lues lors de la création du Merger, et les documents qui y sont joints respectent ces options.

2. Les documents PDF auto‑étiquetés conservent le format et le titre de la source

Aucun changement d’API. Un document PDF enregistré avec PdfSaveOptions.AccesibilitySettings.EnableAutoTagging à true conserve le format PDF et le titre de la source. Auparavant chaque document auto‑étiqueté était marqué comme PDF/UA‑1, et une source sans titre recevait le titre « Tagged PDF ». L’auto‑étiquetage ajoute un arbre de structure logique ; il ne rend pas le document conforme PDF/UA, et une source déjà marquée PDF/UA conserve son marquage.

3. Documents EPUB à mise en page fixe — une page par page de livre

Aucun changement d’API. Un document EPUB à mise en page fixe possède désormais une page par page de livre. Auparavant chaque page de livre était rendue en deux pages, de sorte que GetDocumentInfo indiquait deux fois le nombre de pages et que la page N ne correspondait pas à la page N du livre. Les numéros de page transmis aux opérations de page telles que ExtractPages, RemovePages ou Split font désormais référence aux pages du livre.

4. GroupDocs.Merger.LowCode — chemin de sortie et documents joints

  • JoinPdf, JoinDocx, JoinPptx et RemovePagesPdf résolvent un chemin de sortie relatif par rapport au répertoire de travail actuel. Un chemin de sortie fourni sous forme de nom de fichier seul est maintenant enregistré dans le répertoire courant ; auparavant il était enregistré dans le répertoire de sortie par défaut du Merger. Un chemin de sortie nul ou vide lève ArgumentNullException`.
  • JoinPdf, JoinDocx et JoinPptx lèvent FileTypeNotSupportedExceptionlorsqu’une extension de document joint ne correspond pas au format du produit, avant toute écriture de sortie, par exemple « Input format does not match the expected format ‘PDF’; the joined file ‘a.docx’ is ‘Microsoft Word Open XML Document (.docx)’. ». AuparavantJoinPdfetJoinDocxproduisaient une sortie mixte etJoinPptxéchouait plus tard avec un autre message. Un chemin de document joint nul ou vide lèveArgumentNullException` (« The document at index 0 is null or empty. »).
  • Les sept produits lèvent FileTypeNotSupportedException (« Input format does not match the expected format ‘PDF’; the supplied file is ‘Unknown’. ») lorsqu’un chemin source ne possède pas d’extension, au lieu de ArgumentException.

5. Dépendances

  • Les packages d’exécution dépendent de System.Security.Cryptography.Pkcs 8.0.2 (GroupDocs.Merger.Net60, GroupDocs.Merger.Net80 et leurs packages .Windows) ou 9.0.21 (GroupDocs.Merger.Net100 et GroupDocs.Merger.Net100.Windows). GroupDocs.Merger.Net60, GroupDocs.Merger.Net60.Windows et GroupDocs.Merger.LowCode dépendent également de System.Formats.Asn1 8.0.2, et GroupDocs.Merger.LowCode de System.Security.Cryptography.Pkcs 8.0.2. GroupDocs.Merger.Net462 reste inchangé.
  • Dans les projets .NET Framework, le package GroupDocs.Merger n’ajoute plus de redirection de liaison pour System.ValueTuple dans app.config ou web.config (projets packages.config), et ses builds .NET Framework définissent DependsOnNETStandard à true sauf si le projet le surcharge.

Nouvelles fonctionnalités

  • Contrôle des ressources externes : les images distantes, feuilles de style, images liées et autres fichiers référencés par un document ne sont plus chargés à moins que vous ne les autorisiez. LoadOptions possède les nouvelles propriétés SkipExternalResources, WhitelistedResources et ExternalResourceHandler pour autoriser des emplacements de confiance, autoriser tout pour les documents de confiance, ou décider, sauter ou fournir chaque ressource dans votre propre code.
  • Corrections de concurrence : les documents EPUB ne tombent plus de façon intermittente avec NullReferenceException ou IndexOutOfRangeException, et les documents TeX ne génèrent plus ArgumentException lorsqu’ils sont traités depuis plusieurs threads.
  • Documents EPUB : les EPUB à mise en page fixe possèdent désormais une page par page de livre, de sorte que la page N correspond à la page N du livre. Les EPUB dont le fichier de table des matières a une extension autre que .ncx ne génèrent plus NullReferenceException.
  • Sortie PDF auto‑étiquetée : un document PDF enregistré avec l’auto‑étiquetage conserve le format et le titre de la source. Il n’est plus marqué PDF/UA‑1 sauf si la source l’était, et une source sans titre ne reçoit plus le titre « Tagged PDF ».
  • Projets .NET Framework : les jointures d’images dans les projets packages.config ne échouent plus à charger System.ValueTuple, et les jointures avec des documents SVG ne tombent plus sur le chargement de netstandard sur les runtimes .NET Framework 4.6.2 à 4.7.0.
  • Dépendance corrigée : les packages dépendent de System.Security.Cryptography.Pkcs 8.0.2 (.NET 6.0 et .NET 8.0) ou 9.0.21 (.NET 10.0), les versions qui corrigent CVE‑2026‑84008 et CVE‑2026‑70162.
  • Produits LowCode : un chemin de sortie fourni sous forme de nom de fichier seul est enregistré dans le répertoire courant, et JoinPdf, JoinDocx et JoinPptx rejettent un document joint d’un autre format avant toute écriture de sortie.

Exemple de code

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
        }
    }
}

Comment obtenir la mise à jour

NuGet

Mettez à jour vers le dernier package GroupDocs.Merger via NuGet : GroupDocs.Merger 26.10.0

dotnet add package GroupDocs.Merger --version 26.10.0

Téléchargement direct

Téléchargez les assemblages depuis la page GroupDocs.Merger for .NET 26.10 .

Ressources