介绍
PDF 已成为合同、规范、报告和监管文件的事实标准——由于流通的版本众多,快速找出两个文件之间的具体变化变得繁琐。并排滚动文档并手动标注差异无法规模化,即使是像 Adobe Acrobat 的 Compare 功能这样的专用工具,也需要对每一对文件进行手动干预。
GroupDocs.Comparison for .NET 让您可以完全通过代码执行 PDF 比较,并精确选择结果的呈现方式。26.4 版本引入了专用的 PdfCompareOptions 类,提供三种输出显示模式:
- Inline (默认) — 单个合并的 PDF,删除和插入的内容在同一页上以不同颜色高亮显示。这是经典行为,也是最容易以独立文件共享的结果。
- Side‑by‑Side — 每个结果页显示并排放置的源页面和目标页面,内容不重叠。当文档差异很大且在同一页混合内容会导致混乱时,这种模式非常理想。
- 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 中运行比较:
- 打开 Acrobat Pro 并选择 Tools → Compare Files。
- 选择 Older File(源文件)和 Newer File(目标文件)。
- 点击 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.pdf和target.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);
}
注意:
Inline是DisplayMode的默认值,因此上述options块是可选的。直接调用comparer.Compare("result_inline.pdf")将产生相同的输出。
Resulting document in Inline mode:
What happens under the hood:
- 来自源文档的删除内容以一种颜色高亮(默认红色)。
- 来自目标文档的插入内容以另一种颜色高亮(默认绿色)。
- 两套更改共存于同一页上,因而结果紧凑,但当文档差异很大时可能显得杂乱。大量文本编辑时,删除和插入的内容可能在页面上物理重叠——例如,被替换的段落会覆盖原始段落,导致难以阅读的混乱。在这种情况下,
SideBySide或Interleaved模式是更好的选择。
模式 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:
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):
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);
}
当 PagesSetup 为 null(或未设置)时,所有页面都会被比较——行为与以前的版本相同。
探索 PdfCompareOptions
PdfCompareOptions 是 CompareOptions 的 PDF 专用子类,遵循与 26.2 版本引入的 WordCompareOptions 相同的模式。它将所有仅适用于 PDF 的设置集中在一个位置,避免您不小心将 Word 或电子表格特定的选项应用于 PDF 任务。
| Property | Type | Description |
|---|---|---|
DisplayMode |
ComparisonDisplayMode |
控制结果布局:Inline(默认)、SideBySide 或 Interleaved。 |
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 的基属性 — InsertedItemStyle、DeletedItemStyle、ChangedItemStyle — 也可用,允许在需要时覆盖默认的高亮颜色。
编程获取更改
无论显示模式如何,您都可以通过 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 专用设置集中在一个易于发现的类中。
选择最适合您工作流的模式,或生成全部三种模式,让不同受众自行选择偏好的视图。