我们很高兴宣布 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 开始,默认跳过外部资源,适用于 Word 处理、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.ExternalResourceHandlerExternalResourceHandler类ExternalResourceLoadingArgs类
未删除或更改任何公共成员。
如何获取更新
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 页面下载此发布。