我們很高興宣布 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 頁面下載組件。