介绍

PDF 已成为合同、规范、报告和监管文件的事实标准——由于流通的版本众多,快速找出两个文件之间的具体变化变得繁琐。并排滚动文档并手动标注差异无法规模化,即使是像 Adobe Acrobat 的 Compare 功能这样的专用工具,也需要对每一对文件进行手动干预。

GroupDocs.Comparison for .NET 让您可以完全通过代码执行 PDF 比较,并精确选择结果的呈现方式。26.4 版本引入了专用的 PdfCompareOptions 类,提供三种输出显示模式:

  1. Inline (默认) — 单个合并的 PDF,删除和插入的内容在同一页上以不同颜色高亮显示。这是经典行为,也是最容易以独立文件共享的结果。
  2. Side‑by‑Side — 每个结果页显示并排放置的源页面和目标页面,内容不重叠。当文档差异很大且在同一页混合内容会导致混乱时,这种模式非常理想。
  3. Interleaved — 结果包含交替的页面:奇数页来自源文档(删除内容高亮),偶数页来自目标文档(插入内容高亮)。更改以原生 PDF 注释的形式呈现——这是一种内置的 PDF 对象类型,携带如更改类型和作者姓名等元数据。大多数 PDF 查看器(Adobe Acrobat Reader、Foxit 等)都允许用户打开注释面板并接受或删除单个注释,从而实现无需额外软件的轻量级审阅工作流。将此文件在“两个页面视图”PDF 阅读器中打开即可自然地实现左右对比。

本文将通过可运行的 C# 示例逐一演示这三种模式,深入探讨 PdfCompareOptions 及其属性,并简要说明如何在 Adobe Acrobat 中手动完成相同的任务。


在 Adobe Acrobat 中比较 PDF

在深入编程方式之前,了解 Adobe Acrobat Pro 开箱即用的功能是值得的。Acrobat 内置的 Compare Files 工具(位于 Tools → Compare Files)会生成并排报告,突出显示文本更改、图像差异和格式变化。

在 Acrobat Pro 中运行比较:

  1. 打开 Acrobat Pro 并选择 Tools → Compare Files
  2. 选择 Older File(源文件)和 Newer File(目标文件)。
  3. 点击 Compare。Acrobat 会生成包含摘要页和内联更改标记的交互式比较报告。

这对于偶尔的手动审阅效果良好。然而,当比较需要成为自动化流水线的一部分时,Acrobat 的比较工具存在显著限制。

当比较必须在服务器上、CI/CD 流水线中或自定义审阅工作流中进行时,代码优先的库才是合适的工具。


前置条件

  • .NET 6.0 或更高版本。
  • GroupDocs.Comparison for .NET 26.4 或更高版本 — 通过 NuGet 安装:
dotnet add package GroupDocs.Comparison
  • 一个 license file (GroupDocs.Comparison.lic)。如果没有许可证,库将在评估模式下运行,带有水印和页数限制。您可以请求一个用于测试的 temporary license
  • 两个待比较的 PDF 文件——我们将其称为 source.pdftarget.pdf。示例内容:
source.pdf target.pdf

模式 1:内联比较(默认)

使用场景: 您希望得到一个单一的、独立的 PDF 文件,任何人都能打开并立即看到更改——无需特殊查看器或双页布局。典型场景是与对方共享带有删改痕迹的合同草稿。

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.Inline
    };

    comparer.Compare("result_inline.pdf", options);
}

注意: InlineDisplayMode 的默认值,因此上述 options 块是可选的。直接调用 comparer.Compare("result_inline.pdf") 将产生相同的输出。

Resulting document in Inline mode:

PDF comparison result in Inline mode

What happens under the hood:

  • 来自源文档的删除内容以一种颜色高亮(默认红色)。
  • 来自目标文档的插入内容以另一种颜色高亮(默认绿色)。
  • 两套更改共存于同一页上,因而结果紧凑,但当文档差异很大时可能显得杂乱。大量文本编辑时,删除和插入的内容可能在页面上物理重叠——例如,被替换的段落会覆盖原始段落,导致难以阅读的混乱。在这种情况下,SideBySideInterleaved 模式是更好的选择。

模式 2:并排比较

使用场景: 两个文档差异很大,将删除和插入放在同一页上会导致结果难以阅读。Side‑by‑Side 将源和目标内容严格分离,便于快速浏览每页。

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.SideBySide
    };

    comparer.Compare("result_side_by_side.pdf", options);
}

Resulting document in Side‑by‑Side mode:

PDF comparison result in Side-by-Side mode

What happens under the hood:

  • 每个结果页实际上是一个宽画布,分为左右两半。
  • 左半部分显示对应的源页面,删除内容高亮。
  • 右半部分显示目标页面,插入内容高亮。
  • 两个文档的内容从不重叠,即使是大量编辑的页面也保持可读。

模式 3:交错比较

使用场景: 您希望在标准 PDF 阅读器中使用其 Two Page View(或“Facing Pages”)模式逐页审阅更改。每个源页面位于左侧,对应的目标页面位于右侧——页面布局与 Side‑by‑Side 在单个画布上的渲染相同,但每页保持完整大小。

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.Interleaved,
        AnnotationAuthorName = "GroupDocs"
    };

    comparer.Compare("result_interleaved.pdf", options);
}

Resulting document in Interleaved mode (shown in Two Page View):

PDF comparison result in Interleaved mode viewed in Two Page View

What happens under the hood:

  • 结果文档包含 2 × N 页,对应 N 页的源/目标对。
  • 奇数页(1、3、5 …)为源页面,删除内容高亮。
  • 偶数页(2、4、6 …)为目标页面,插入内容高亮。
  • AnnotationAuthorName 在比较期间生成的 PDF 注释上标记作者姓名——当结果进入需要区分多位作者评论的审阅工作流时,这非常有用。

提示: 在 Adobe Acrobat Reader 或任何支持 View → Page Display → Two Page View 的查看器中打开结果,即可自动获得预期的左右布局。


将比较限制在页面范围内

所有三种模式都支持通过 PagesSetup 属性进行页面范围过滤。当仅有大型文档的特定章节或部分发生更改且您想跳过其余部分时,这非常有用。

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.SideBySide,
        PagesSetup = new PagesSetup
        {
            StartPage = 3,
            EndPage = 10
        }
    };

    comparer.Compare("result_pages_3_to_10.pdf", options);
}

PagesSetupnull(或未设置)时,所有页面都会被比较——行为与以前的版本相同。


探索 PdfCompareOptions

PdfCompareOptionsCompareOptions 的 PDF 专用子类,遵循与 26.2 版本引入的 WordCompareOptions 相同的模式。它将所有仅适用于 PDF 的设置集中在一个位置,避免您不小心将 Word 或电子表格特定的选项应用于 PDF 任务。

Property Type Description
DisplayMode ComparisonDisplayMode 控制结果布局:Inline(默认)、SideBySideInterleaved
PagesSetup PagesSetup 要比较的页面范围。为 null 时处理所有页面。
CompareImagesPdf bool 是否在比较中包含嵌入的图像。
AnnotationAuthorName string 在 PDF 注释上标记的作者姓名(在 Interleaved 模式中使用)。
ImagesInheritanceMode enum 当图像比较被禁用时,控制哪个文档提供图像。
var options = new PdfCompareOptions
{
    DisplayMode = PdfCompareOptions.ComparisonDisplayMode.Interleaved,
    CompareImagesPdf = true,
    AnnotationAuthorName = "Review Bot",
    PagesSetup = new PagesSetup { StartPage = 1, EndPage = 5 }
};

继承自 CompareOptions 的基属性 — InsertedItemStyleDeletedItemStyleChangedItemStyle — 也可用,允许在需要时覆盖默认的高亮颜色。


编程获取更改

无论显示模式如何,您都可以通过 Comparer.GetChanges() 获取所有检测到的差异的结构化列表。这对于生成自定义报告、将结果输入审阅系统或收集编辑范围统计信息非常有用。

using (var comparer = new Comparer("source.pdf"))
{
    comparer.Add("target.pdf");

    comparer.Compare("result.pdf");

    var changes = comparer.GetChanges(); // returns ChangeInfo[]
    Console.WriteLine($"Total changes detected: {changes.Length}");
}

See the official API reference for details: Comparer.GetChanges.


处理受密码保护的 PDF

受密码保护的 PDF 完全受支持。在创建 Comparer 时通过 LoadOptions 传递密码:

using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

using (var comparer = new Comparer("source_protected.pdf",
    new LoadOptions { Password = "secret" }))
{
    comparer.Add("target_protected.pdf", new LoadOptions { Password = "secret" });

    var options = new PdfCompareOptions
    {
        DisplayMode = PdfCompareOptions.ComparisonDisplayMode.SideBySide
    };

    comparer.Compare("result_protected.pdf", options);
}

获取免费试用

您可以从 official releases page 下载 GroupDocs.Comparison for .NET。若需无限制测试,请请求一个 temporary license ——无需信用卡。


常见问题

问:我是否需要在服务器上安装 Adobe Acrobat 或其他 PDF 软件?
答: 不需要。GroupDocs.Comparison 是一个独立的 .NET 库,可在不依赖任何第三方的情况下读取和写入 PDF 文件。

问:默认应使用哪种显示模式?
答: 首先使用 Inline ——它生成最紧凑的结果,最易共享。当大量编辑使内联视图难以阅读时切换到 SideBySide,或在审阅者将使用 “Two Page View” PDF 阅读器打开结果时使用 Interleaved

问:我能比较除 PDF 之外的其他格式的文档吗?
答: 可以 —— 该库支持 Word 文档、Excel 电子表格、PowerPoint 演示文稿、纯文本文件等。完整列表请参见 documentation

问:如果我不设置许可证会怎样?
答: 库将在评估模式下运行。输出文档会带有水印,并且仅处理前几页。使用 temporary license 可在测试时移除这些限制。

问:我能只比较 PDF 中的图像而忽略文本更改吗?
答:PdfCompareOptions 上使用 CompareImagesPdf = true 以包含图像比较。若仅关注图像,可将其与 ImagesInheritanceMode 属性结合使用;详情请参阅 API 参考。


结论

GroupDocs.Comparison for .NET 26.4 为您提供了精确、代码驱动的方式来控制 PDF 比较结果的呈现。Inline 模式覆盖了最常见的使用场景——单个可共享的带删改痕迹的 PDF。SideBySide 使大量更改的内容保持清晰可读。Interleaved 与任何 PDF 查看器的 Two Page View 自然配合,实现全尺寸的逐页浏览。除此之外,页面范围过滤让您精准定位重要章节,而 PdfCompareOptions 将所有 PDF 专用设置集中在一个易于发现的类中。

选择最适合您工作流的模式,或生成全部三种模式,让不同受众自行选择偏好的视图。

其他资源