我們很高興宣布 GroupDocs.Merger for .NET v26.10 已於 2026年10月 發佈。此版本引入了控制外部資源載入的重大增強,解決了 EPUB 與 TeX 處理中的關鍵併發問題,改進了 EPUB 分頁,保留了自動標記輸出中的 PDF 格式與標題,並修復了多個與 .NET Framework 相關的失敗。總體而言,包含 10 項功能、改進與錯誤修復。

此版本的新功能

  • [功能] 預設跳過載入外部資源,並提供可信位置的白名單與每個資源的處理程序
  • [錯誤] 修復 EPUB 文件的目錄檔案未使用 .ncx 副檔名時拋出的 NullReferenceException
  • [錯誤] 修復在 .NET Framework packages.config 專案中影像合併時無法載入 System.ValueTuple 的問題
  • [錯誤] 修復在 .NET Framework 4.6.2 至 4.7.0 執行階段中合併 SVG 文件時失敗的問題
  • [錯誤] 將固定版面 EPUB 頁面改為每本書一頁,而不是分成兩頁
  • [錯誤] 將 System.Security.Cryptography.Pkcs 更新至 8.0.2 與 9.0.21(CVE-2026-84008、CVE-2026-70162)
  • [錯誤] 在啟用自動標記時,保存 PDF 時保留原始 PDF 格式與標題
  • [錯誤] 修復同時載入 TeX 文件時拋出的 ArgumentException
  • [錯誤] 將 LowCode 輸出以裸檔名保存至當前目錄,並拒絕合併不同格式的文件
  • [錯誤] 修復同時處理 EPUB 文件時偶爾拋出的 NullReferenceException 或 IndexOutOfRangeException

公開 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 — 在 SkipExternalResources 為 true 時會載入的資源絕對 URI 前綴,例如 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(「白名單資源 ‘…’ 必須是沒有查詢、片段或編碼的 ‘/’、‘\’、‘.’ 的絕對 URI。」)。
  • 若處理程序拋出例外,該資源會被跳過,操作會拋出 GroupDocsMergerException(「外部資源處理程序拋出例外;資源已被跳過。請參閱內部例外。」),內部例外即為處理程序的例外。
  • EPUB 文件,以及某些操作中的 SVG 與 SVGZ 文件,現在會檢查其標記中是否有外部參考。若標記不是良好形成的 XML,將拋出 GroupDocsMergerException(「無法讀取文件的標記以檢查外部資源,因而未載入。將 SkipExternalResources 設為 false 且不使用 ExternalResourceHandler,即可在不檢查的情況下載入。」)。
  • OleDiagramOptions、OleSpreadsheetOptions 與 OleWordProcessingOptions 接受檔案路徑與頁碼的建構函式,會在外部資源被拒絕的情況下渲染嵌入物件的影像,無論目標文件的 LoadOptions 設定為何。若要顯示它們,請使用接受影像資料的建構函式自行傳入影像。
  • GroupDocs.Merger.LowCode 套件的產品始終拒絕外部資源。

這些選項會在建立 Merger 時讀取,之後加入的文件皆遵循該選項。

2. 自動標記的 PDF 文件保留來源的格式與標題

無 API 變更。將 PdfSaveOptions.AccesibilitySettings.EnableAutoTagging 設為 true 後保存的 PDF,會保留來源的 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 套件不再於 app.config 或 web.config(packages.config 專案)中加入 System.ValueTuple 的 binding redirect,且其 .NET Framework 建置目標會將 DependsOnNETStandard 設為 true,除非專案自行設定。

新功能

  • 外部資源控制: 除非明確允許,文件引用的遠端圖片、樣式表、連結圖片與其他檔案將不會被載入。LoadOptions 新增 SkipExternalResources、WhitelistedResources 與 ExternalResourceHandler 屬性,以允許可信位置、對信任的文件允許全部,或在程式碼中自行決定、跳過或提供每個資源。
  • 併發修正: EPUB 文件不再因同時處理而偶爾拋出 NullReferenceException 或 IndexOutOfRangeException,TeX 文件亦不會因同時處理而拋出 ArgumentException。
  • EPUB 文件: 固定版面 EPUB 現在每本書頁面僅對應一個輸出頁面,頁碼 N 為書本頁面 N。目錄檔案副檔名非 .ncx 的 EPUB 不再拋出 NullReferenceException。
  • 自動標記的 PDF 輸出: 以自動標記保存的 PDF 保留來源的格式與標題。除非來源本身為 PDF/UA,否則不會被標記為 PDF/UA-1,未命名的來源也不會得到「Tagged PDF」標題。
  • .NET Framework 專案: packages.config 專案中的影像合併不再無法載入 System.ValueTuple,SVG 文件的合併也不再在 .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)
{
    // 僅從一個可信資料夾載入資源;其他全部拒絕
    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;   // 允許;其他資源保持預設決策
        }
    }
}

如何取得更新

NuGet

透過 NuGet 升級至最新的 GroupDocs.Merger 套件:GroupDocs.Merger 26.10.0

dotnet add package GroupDocs.Merger --version 26.10.0

直接下載

從 GroupDocs.Merger for .NET 26.10 頁面下載組件。

資源