如何使用 C# 删除 PDF 注释 – GroupDocs.Annotation 指南

介绍

如果您需要快速且可靠地remove pdf annotations c#,那么您来对地方了。无论是清理面向客户的报告、净化法律文件,还是自动化批量处理已审阅的 PDF,手工操作既繁琐又容易出错。本教程将带您使用 GroupDocs.Annotation for .NET 完整演示整个流程,从库的安装到处理密码保护文件等边缘情况。结束时,您只需几行 C# 代码即可去除 PDF 中的任何注释——高亮、粘贴便签、印章或绘图。

您将掌握的内容:

  • 安装并授权 GroupDocs.Annotation for .NET
  • 编写简洁的 C# 代码在单文件和批处理场景中remove pdf annotations c#
  • 处理大尺寸 PDF、内存限制以及常见错误情况
  • 将解决方案扩展为仅选择性删除特定注释类型(例如 remove sticky notes pdf)

让我们开始,让注释清理变得轻而易举。

快速答案

  • 我可以一次性删除所有注释类型吗? 可以——在使用 Get() 检索后调用 annotator.Remove(allAnnotations)。
  • 生产环境是否需要许可证? 有效的 GroupDocs.Annotation 许可证会去除水印并解锁全部功能。
  • 支持哪些 .NET 版本? .NET Framework 4.6.2+、.NET Core 2.0+、.NET 5/6/7。
  • 如何处理受密码保护的 PDF? 在创建 Annotator 时通过 LoadOptions 传入密码。
  • 我可以自动处理数百个文件吗? 完全可以——将单文件代码与 foreach 循环或并行处理结合用于批量作业。

什么是 remove pdf annotations c#?

remove pdf annotations c# 是使用 C# 编程方式删除 PDF 文档中嵌入的所有注释对象的过程。该操作仅作用于注释层,保持底层文本、图像和布局不变。它会删除所有注释对象——如高亮、评论、印章和绘图——同时保留 PDF 的原始内容、布局和元数据,使文档干净、可直接分发或归档。只有在删除前保留源文件备份时,此过程才可逆。

为什么选择 GroupDocs.Annotation 来删除 PDF 注释?

GroupDocs.Annotation 支持30 多种注释类型(包括高亮、粘贴便签、印章和自由绘图),并且能够在不将整个文件加载到内存的情况下处理高达500 MB的 PDF。该 API 可在任何支持 .NET 的平台上运行,为桌面和 Web 应用提供一致的高性能解决方案。

前置条件

  • GroupDocs.Annotation for .NET ≥ 25.4.0
  • Visual Studio 2017 或更高版本
  • 具备管理员权限以安装 NuGet 包
  • 基础 C# 知识(变量、using 语句、异常处理)

如何使用 GroupDocs.Annotation 删除 PDF 注释?

工作流包括使用 Annotator 类加载 PDF、通过 Get() 获取完整注释列表、对该集合调用 Remove(),最后保存修改后的文档。此顺序一次性处理所有注释类型,适用于单文件和批处理场景。

步骤 1:定义输入和输出路径

首先,将代码指向源 PDF 并决定清理后文件的存放位置。

Install-Package GroupDocs.Annotation -Version 25.4.0

步骤 2:初始化 Annotator 对象

Annotator 类是所有注释操作的入口。

dotnet add package GroupDocs.Annotation --version 25.4.0

定义锚点: Annotator 类提供加载、查询、修改和保存 PDF 注释的方法。

步骤 3:检索所有注释

从文档中获取每个注释对象。

using System;
using GroupDocs.Annotation;

class Program
{
    static void Main()
    {
        // Initialize license if available
        License lic = new License();
        lic.SetLicense("path/to/your/license.lic");

        Console.WriteLine("GroupDocs.Annotation initialized successfully.");
    }
}

说明: Get() 返回一个 AnnotationBase 对象集合,代表文档中存在的所有注释——高亮、粘贴便签、印章、绘图等。

步骤 4:删除注释

一次性删除检索到的注释集合。

string inputFilePath = Path.Combine("YOUR_DOCUMENT_DIRECTORY", "ANNOTATED_FILE_NAME");
string outputPath = Path.Combine("YOUR_OUTPUT_DIRECTORY", "result.pdf");

说明: Remove 方法接受该集合并将每个注释从 PDF 中剥离。如果集合为空,方法安全地不执行任何操作。

步骤 5:保存清理后的文档

将无注释的 PDF 写回磁盘。

string inputFilePath = @"C:\Documents\Annotated\project_proposal_with_comments.pdf";
string outputPath = @"C:\Documents\Clean\project_proposal_final.pdf";

说明: Save 将更改持久化。输出文件可以放在同一文件夹或其他位置,取决于您的工作流。

完整可运行示例

下面是整合了全部五个步骤的完整可运行代码。

using (Annotator annotator = new Annotator(inputFilePath))
{
    // All the magic happens inside this using block
}

常见问题与故障排除

  • 文件未找到: 在调用 new Annotator 前使用 File.Exists(inputPath) 验证路径是否准确。
  • 访问被拒绝: 确保进程拥有读写权限且 PDF 未被其他程序打开。
  • 大文件内存压力: 对于超过 100 MB 的 PDF,提升进程内存限制或将文件分批处理。
  • PDF 损坏: 将逻辑包装在 try‑catch 块中;GroupDocs.Annotation 会在不支持或损坏的文件上抛出 AnnotationException。

真实场景案例

  • 法律文件准备: 律师事务所使用此脚本在向法院提交合同前清除内部评论。
  • 学术出版: 研究人员清理同行评审批注,以生成用于期刊投稿的干净稿件。
  • 企业报告: 财务部门在内部审阅后自动生成无水印的季度报告供投资者使用。
  • 文档归档: 政府机构批量处理数千份带注释的公共记录,仅保存最终的无注释版本以作长期保存。

性能最佳实践

内存管理

  • 始终在 using 语句块中使用 Annotator,以确保及时释放资源。
  • 将文件分批(10–20 个)处理,以保持内存使用可预测。

优化技术

List<AnnotationBase> annotations = annotator.Get();
Console.WriteLine($"Found {annotations.Count} annotations to remove.");

并行处理

在高吞吐量环境下,可并行处理多个文件:

if (annotations.Count > 0)
{
    annotator.Remove(annotations);
    Console.WriteLine("All annotations removed successfully.");
}
else
{
    Console.WriteLine("No annotations found in the document.");
}

警告: 并行会增加 CPU 和 I/O 负载;请监控系统资源以避免限流。

高级场景

有选择地删除注释

如果只需删除粘贴便签,可在调用 Remove 前按 AnnotationType.StickyNote 进行过滤。

annotator.Save(outputPath);
Console.WriteLine($"Clean document saved to: {outputPath}");

批量处理多个文件

遍历 PDF 目录,对每个文件应用相同的删除逻辑。

using System;
using System.Collections.Generic;
using System.IO;
using GroupDocs.Annotation;
using GroupDocs.Annotation.Models.AnnotationModels;

class Program
{
    static void Main()
    {
        try
        {
            string inputFilePath = Path.Combine("YOUR_DOCUMENT_DIRECTORY", "ANNOTATED_FILE_NAME");
            string outputPath = Path.Combine("YOUR_OUTPUT_DIRECTORY", "result.pdf");

            using (Annotator annotator = new Annotator(inputFilePath))
            {
                List<AnnotationBase> annotations = annotator.Get();
                Console.WriteLine($"Found {annotations.Count} annotations to remove.");

                if (annotations.Count > 0)
                {
                    annotator.Remove(annotations);
                    Console.WriteLine("All annotations removed successfully.");
                }
                else
                {
                    Console.WriteLine("No annotations found in the document.");
                }

                annotator.Save(outputPath);
                Console.WriteLine($"Clean document saved to: {outputPath}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error processing document: {ex.Message}");
        }
    }
}

常见问答

问:此代码能删除所有类型的 PDF 注释吗?
答:可以——GroupDocs.Annotation 能处理所有标准注释类型,包括高亮、粘贴便签、印章、自由绘图和文本标记。

问:支持哪些 PDF 版本?
答:库兼容从 1.2 版到最新 2.0 规范的 PDF,几乎覆盖您会遇到的所有文件。

问:一次可以删除多少注释?
答:没有硬性限制;性能随文档大小和系统内存线性变化。对于超大文件,建议分块处理。

问:保存后还能撤销删除吗?
答:保存后注释会永久删除。如需恢复,请保留原始 PDF 的备份。

问:如何处理受密码保护的 PDF?
答:在构造 Annotator 时通过 LoadOptions 提供密码,例如 new Annotator(path, new LoadOptions { Password = "pwd" })。

问:如果输入的 PDF 损坏会怎样?
答:API 会抛出异常。请将操作包装在 try‑catch 块中,以记录错误并继续处理其他文件。

问:可以在 ASP.NET Web 应用中使用吗?
答:完全可以——GroupDocs.Annotation 线程安全,适用于 ASP.NET Core、MVC 和 Web API 项目。

问:商业使用是否需要许可证?
答:是的——生产许可证会去除水印并解锁全部功能。可获取试用许可证进行评估。

问:如何验证所有注释已被删除?
答:调用 Remove 后再次执行 annotator.Get();若返回空集合则说明已全部删除。

问:删除注释会影响 PDF 布局吗?
答:不会——文本、图像和页面结构保持不变,仅剥离注释层。

其他资源


最后更新: 2026-06-01
测试环境: GroupDocs.Annotation 25.4.0 for .NET
作者: GroupDocs

// For batch processing, consider this pattern:
public static void ProcessDocumentBatch(List<string> filePaths)
{
    foreach (string filePath in filePaths)
    {
        using (Annotator annotator = new Annotator(filePath))
        {
            // Process each file individually
            var annotations = annotator.Get();
            if (annotations.Count > 0)
            {
                annotator.Remove(annotations);
                annotator.Save(GetOutputPath(filePath));
            }
        }
        // Force garbage collection periodically for large batches
        if (filePaths.IndexOf(filePath) % 20 == 0)
        {
            GC.Collect();
        }
    }
}
Parallel.ForEach(filePaths, filePath =>
{
    using (Annotator annotator = new Annotator(filePath))
    {
        var annotations = annotator.Get();
        if (annotations.Count > 0)
        {
            annotator.Remove(annotations);
            annotator.Save(GetOutputPath(filePath));
        }
    }
});
// Remove only highlight annotations
var annotations = annotator.Get();
var highlightAnnotations = annotations.Where(a => a.Type == AnnotationType.Highlight).ToList();
annotator.Remove(highlightAnnotations);
string[] pdfFiles = Directory.GetFiles(@"C:\AnnotatedPDFs", "*.pdf");
foreach (string file in pdfFiles)
{
    ProcessSingleFile(file);
}

相关教程