我們很高興宣布 GroupDocs.Annotation for .NET 26.10,於 2026 年 10 月發布。此版本聚焦於安全性:文件不再自行載入遠端圖像、樣式表或連結檔案,且新的 LoadOptions 成員讓您精確決定可載入的內容。此版本同時升級了底層文件引擎,更新了易受攻擊的相依性,並修復了多項問題。
此版本的新功能
| 代號 | 類別 | 摘要 |
|---|---|---|
| ANNOTATIONNET-2663 | ⚠️ 增強 | 外部資源不再預設載入(新 LoadOptions 控制) |
| ANNOTATIONNET-2687 | ✨ 增強 | 升級底層文件引擎 |
| ANNOTATIONNET-2672 | 🔒 安全 | 將 System.Security.Cryptography.Pkcs 更新至 8.0.2(CVE-2026-84008 / CVE-2026-70162) |
| ANNOTATIONNET-2102 | 🔧 修復 | 修復從 EML 文件提取註釋時的 FileTypeNotSupportedException |
| ANNOTATIONNET-1903 | 🔧 修復 | 修復舊版註釋的文件在 .NET 8 上無法開啟 |
| ANNOTATIONNET-2689 | 🔧 修復 | 修復 PDF 頁面旋轉 90 度在儲存時遺失 |
外部資源不再預設載入
文件可以引用外部資源:HTML 頁面或電子郵件正文中的 <img src="https://...">、Word 文件中的連結圖片、遠端樣式表或外部工作簿連結。在此之前,開啟、預覽或儲存此類文件會使 GroupDocs.Annotation 從網路或檔案分享中請求這些資源。
在處理不受信任文件的伺服器上,這會構成 伺服器端請求偽造 (SSRF) 風險:文件可能使伺服器呼叫內部位址,且 UNC 路徑可能洩漏執行程序的 Windows 憑證。
從 26.10 開始,外部資源預設會被跳過,適用於文字處理、HTML、電子郵件、簡報與試算表文件:
- 不發出請求。 在任何操作(
Get、Add、Save、GeneratePreview與GetDocumentInfo)中,對文件引用的資源不會發出網路或檔案分享請求。 - 空白佔位符。 被跳過的圖像會以透明佔位符呈現,且原始連結會保留在儲存的文件中。
- 嵌入內容仍可運作。 電子郵件的
cid:部分、data:URI 以及嵌入圖片始終會被載入。 - 圖像註釋不受影響。
ImageAnnotation.ImagePath仍會從 URL 載入。
這是行為變更。 若您的文件依賴遠端圖像或樣式表的呈現,請使用新的 LoadOptions 成員明確允許它們:
| 成員 | 預設值 | 說明 |
|---|---|---|
SkipExternalResources |
true |
跳過外部資源。將其設為 false 可恢復 26.10 之前的行為。 |
WhitelistedResources |
empty | 即使資源被跳過,也會載入的主機名稱或絕對 URI 前綴。 |
ExternalResourceHandler |
null |
對每個外部資源皆會呼叫;可允許、跳過或提供其內容。 |
僅允許受信任的主機(建議):
LoadOptions loadOptions = new LoadOptions
{
// SkipExternalResources stays true (the default)
WhitelistedResources = { "cdn.example.com", "https://intranet.example.com/images/" }
};
using (Annotator annotator = new Annotator("input.html", loadOptions))
{
annotator.Save("output.html"); // only images from the two whitelisted locations are loaded
}
使用處理程序檢查、允許或替換每個資源:
class AuditingResourceHandler : ExternalResourceHandler
{
public override void OnLoading(ExternalResourceLoadingArgs args)
{
Console.WriteLine($"{args.Uri}: {(args.Skipped ? "skipped" : "loaded")}");
// serve a local copy instead of going to the network
if (args.Uri == "https://example.com/logo.png")
args.Data = File.ReadAllBytes("logo.png");
}
}
升級的文件引擎
隨附的文字處理、試算表、簡報、PDF、圖表、電子郵件、影像、CAD 與圖形渲染引擎已更新至 2026 年 10 月的版本。重新產生的文件與頁面預覽在位元或像素層面可能略有差異,但在視覺上仍相等。
對於 .NET 6 與 .NET 8 專案,執行時套件現在依賴 SkiaSharp 4.152.1。如果您的專案直接引用 SkiaSharp 3.x,請將其更新至 4.x。
安全性更新
文件引擎引入了 System.Security.Cryptography.Pkcs 8.0.0 或 8.0.1,受到 CVE-2026-84008 與 CVE-2026-70162 的影響。GroupDocs.Annotation 現在在所有目標框架上引用已修補的 8.0.2。無需更改程式碼。
修復
- 從串流讀取 EML。 以
MIME-Version: 1.0開頭的 EML 訊息被誤判為 MHT 壓縮檔,從串流開啟時拋出FileTypeNotSupportedException。此類訊息現在可從串流或檔案以相同方式開啟,且 現在支援 MHT 檔作為電子郵件文件。 - 舊版文件在 .NET 8 上。 由 26.6 之前的版本註釋的文件在 .NET 8 上會因
NotSupportedException無法開啟。現在已可開啟:舊版註釋會被跳過並產生日誌警告,且可新增與儲存新註釋。相關的重新儲存簡報(PPTX)註釋無法讀回的問題已在所有框架上修復。 - PDF 旋轉 90 度。 使用
Annotator.Rotation旋轉 PDF 頁面時,180 度與 270 度可正常工作,但 90 度的旋轉在儲存時會遺失。現在已在所有角度保留:
using (Annotator annotator = new Annotator("input.pdf"))
{
annotator.ProcessPages = 1; // the page to rotate
annotator.Rotation = RotationDocument.on90; // previously ignored
annotator.Save("output.pdf");
}
公開 API 變更
此版本新增以下成員:
LoadOptions.SkipExternalResourcesLoadOptions.WhitelistedResourcesLoadOptions.ExternalResourceHandlerExternalResourceHandlerclassExternalResourceLoadingArgsclass
未移除或變更任何公開成員。
如何取得更新
NuGet
使用 NuGet 安裝或升級至 GroupDocs.Annotation 26.10.0。此套件會自動解析您目標框架的執行時套件(.NET Framework 4.6.2、.NET 6 或 .NET 8):
dotnet add package GroupDocs.Annotation --version 26.10.0
直接下載
從 GroupDocs.Annotation for .NET 26.10 頁面下載此版本。