比较 PDF 文档

请注意,所有比较工具均可在 Aspose.PDF.Drawing 库中使用。

比较 PDF 文档的方法

在处理 PDF 文档时,有时需要比较两个文档的内容以识别差异。Aspose.PDF for .NET 库提供了强大的工具集来实现这一目的。在本文中,我们将探讨如何使用几个简单的代码片段比较 PDF 文档。

Aspose.PDF 中的比较功能允许您逐页比较两个 PDF 文档。您可以选择比较特定页面或整个文档。生成的比较文档突出显示差异,使识别两个文件之间的更改变得更加容易。

以下是使用 Aspose.PDF for .NET 库比较 PDF 文档的可能方法列表:

  1. 比较特定页面 - 比较两个 PDF 文档的第一页。

  2. 比较整个文档 - 比较两个 PDF 文档的整个内容。

  3. 图形比较 PDF 文档

  • 使用 GetDifference 方法比较 PDF - 标记更改的单独图像。

  • 使用 CompareDocumentsToPdf 方法比较 PDF - 标记更改的图像的 PDF 文档。

比较特定页面

第一个代码片段演示了如何比较两个 PDF 文档的第一页。

  1. 文档初始化。 代码首先使用各自的文件路径(documentPath1 和 documentPath2)初始化两个 PDF 文档。路径目前指定为空字符串,但在实际操作中,您需要将其替换为实际的文件路径。

  2. 比较过程。

  • 页面选择 - 比较仅限于每个文档的第一页(‘Pages[1]’)。
  • 比较选项:

‘AdditionalChangeMarks = true’ - 此选项确保显示额外的变更标记。这些标记突出显示可能存在于其他页面上的差异,即使它们不在当前正在比较的页面上。

‘ComparisonMode = ComparisonMode.IgnoreSpaces’ - 此模式告诉比较器忽略文本中的空格,仅关注单词内的更改。

  1. 生成的比较文档突出显示两个页面之间的差异,并保存到 ‘resultPdfPath’ 中指定的文件路径。
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparingSpecificPages()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages2.pdf"))
        {
            // Compare
            Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(document1.Pages[1], document2.Pages[1], dataDir + "ComparingSpecificPages_out.pdf", new Aspose.Pdf.Comparison.SideBySideComparisonOptions
            {
                AdditionalChangeMarks = true,
                ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces,
                DeleteColor = Color.DarkGray,
                InsertColor = Color.LightYellow
            });
        }
    }
}

比较整个文档

第二个代码片段扩展了范围,以比较两个 PDF 文档的整个内容。

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparingEntireDocuments()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments2.pdf"))
        {
            // Compare
            Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(
                document1,
                document2,
                dataDir + "ComparingEntireDocuments_out.pdf",
                new Aspose.Pdf.Comparison.SideBySideComparisonOptions
                {
                    AdditionalChangeMarks = true,
                    ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces,
                    DeleteColor = Color.DarkGray,
                    InsertColor = Color.LightYellow
                });
        }
    }
}

这些代码片段生成的比较结果是 PDF 文档,您可以在 Adobe Acrobat 等查看器中打开。如果您在 Adobe Acrobat 中使用双页视图,您将看到并排显示的更改:

  • 删除 - 这些在左侧页面上标记。
  • 插入 - 这些在右侧页面上标记。

通过将 ‘AdditionalChangeMarks’ 设置为 ’true’,您还可以看到可能发生在其他页面上的更改的标记,即使这些更改不在当前查看的页面上。

Aspose.PDF for .NET 提供了强大的工具来比较 PDF 文档,无论您需要比较特定页面还是整个文档。通过使用 ‘AdditionalChangeMarks’ 和不同的 ‘ComparisonMode 设置’,您可以根据特定需求定制比较过程。生成的文档提供了清晰的并排更改视图,使跟踪修订和确保文档准确性变得更加容易。

使用 GraphicalPdfComparer 比较 PDF 文档

在协作处理文档时,尤其是在专业环境中,您通常会得到同一文件的多个版本。

您可以使用 GraphicalPdfComparer 类来比较 PDF 文档和页面。该类适合比较页面图形内容中的更改。

使用 Aspose.PDF for .NET,您可以比较文档和页面,并将比较结果输出到 PDF 文档或图像文件。

您可以设置以下类属性:

  • 分辨率 - 输出图像的 DPI 单位分辨率,以及在比较过程中生成的图像。
  • 颜色 - 更改标记的颜色。
  • 阈值 - 变化阈值(以百分比表示)。默认值为零。设置非零值可以让您忽略对您来说不重要的图形更改。

该类具有一个方法,允许您以适合进一步处理的形式获取页面图像差异:ImagesDifference GetDifference(Page page1, Page page2)

此方法返回一个 ImagesDifference 类的对象,该对象包含正在比较的第一页的图像和一个差异数组。差异数组和原始图像具有 RGB24bpp 像素格式。

ImagesDifference 允许您生成不同的图像,并通过将差异数组添加到原始图像来获取正在比较的第二页的图像。为此,请使用 ImagesDifference.GetDestinationImage 和 ImagesDifference.DifferenceToImage 方法。

使用 GetDifference 方法比较 PDF

提供的代码定义了一个方法 GetDifference,该方法比较两个 PDF 文档并生成它们之间差异的视觉表示。

此方法比较两个 PDF 文件的第一页,并生成两个 PNG 图像:

  • 一张图像(diffPngFilePath)以红色突出显示页面之间的差异。
  • 另一张图像(destPngFilePath)是目标(第二)PDF 页面的视觉表示。

此过程对于直观比较文档两个版本之间的更改或差异非常有用。

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparePDFWithGetDifferenceMethod()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithGetDifferenceMethod1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithGetDifferenceMethod2.pdf"))
        {
            // Create comparer 
            var comparer = new Aspose.Pdf.Comparison.GraphicalPdfComparer();
            // Compare
            using (var imagesDifference = comparer.GetDifference(document1.Pages[1], document2.Pages[1]))
            {
                using (var diffImg = imagesDifference.DifferenceToImage(Aspose.Pdf.Color.Red, Aspose.Pdf.Color.White))
                {
                    diffImg.Save(dataDir + "ComparePDFWithGetDifferenceMethodDiffPngFilePath_out.png");
                }
                using (var destImg = imagesDifference.GetDestinationImage())
                {
                    destImg.Save(dataDir + "ComparePDFWithGetDifferenceMethodDestPngFilePath_out.png");
                }
            }
        }
    }
}

使用 CompareDocumentsToPdf 方法比较 PDF

提供的代码片段使用 CompareDocumentsToPdf 方法,该方法比较两个文档并生成比较结果的 PDF 报告。

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparePDFWithCompareDocumentsToPdfMethod()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod2.pdf"))
        {
            // Create comparer
            var comparer = new Aspose.Pdf.Comparison.GraphicalPdfComparer()
            {
                Threshold = 3.0,
                Color = Aspose.Pdf.Color.Blue,
                Resolution = new Aspose.Pdf.Devices.Resolution(300)
            };
            // Compare
            comparer.CompareDocumentsToPdf(document1, document2, dataDir + "compareDocumentsToPdf_out.pdf");
        }
    }
}

文档比较的通用方法

您可以使用 TextPdfComparer 类比较文档和单个页面。该类允许逐页或作为单个连续内容流(无页面分隔)比较文档。比较方法返回一个差异数组,可以传递给任何实现 IStringOutputGeneratorIFileOutputGenerator 接口的类,以生成格式化的比较输出。支持的输出格式有:HTMLMarkdownPDFJSON。您还可以使用 ComparisonStatistics 类获取执行比较操作的统计信息。

方法 描述 参数 返回值
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options) 逐页比较两个 PDF 文档。 * document1 – 第一个文档。
* document2 – 第二个文档。
* options – 比较选项(见下文)。
List<List<DiffOperation>> – 每页的差异列表。
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options, string resultPdfDocumentPath) 与上面相同,但还将比较结果保存到 PDF 文件中。 与上面相同的参数 + resultPdfDocumentPath – 输出文件的路径。 List<List<DiffOperation>> – 差异列表。
CompareFlatDocuments(Document document1, Document document2, ComparisonOptions options) 将两个 PDF 文档作为单个连续文本进行比较(合并所有页面)。 CompareDocumentsPageByPage 中的参数相同。 List<DiffOperation> – 所有差异的列表。
CompareFlatDocuments(Document document1, Document document2, ComparisonOptions options, string resultPdfDocumentPath) 扁平文档比较,结果保存到 PDF 文件中。 CompareFlatDocuments 中的参数相同 + resultPdfDocumentPath List<DiffOperation> – 差异列表。
ComparePages(Page page1, Page page2, ComparisonOptions options) 比较两个单独的页面。 * page1 – 第一个页面。
* page2 – 第二个页面。
* options – 比较选项。
List<DiffOperation> – 页面差异列表。
CreateComparisonStatistics(List<DiffOperation> diffs) 为单个页面的操作列表生成比较统计信息。 diffsDiffOperation 的列表。 TextItemComparisonStatistics(见下文)。
CreateComparisonStatistics(List<List<DiffOperation>> diffs) 为跨页面的操作列表生成比较统计信息(文档级别)。 diffsDiffOperation 的列表列表。 DocumentComparisonStatistics(见下文)。
AssemblySourcePageText(List<DiffOperation> diffs) 重建原始(更改前)页面文本。 diffs – 操作列表。 string – 原始文本。
AssemblyDestinationPageText(List<DiffOperation> diffs) 重建修改后的(更改后)页面文本。 diffs – 操作列表。 string – 修改后的文本。

相关公共类

ComparisonOptions

影响比较过程的参数:

属性 类型 描述
ExtractionArea Rectangle 将从中提取文本的区域。与 ExcludeTablesExcludeAreas1/2 不兼容。
ExcludeTables bool 从比较中排除表格。与 ExtractionArea 不兼容。
ExcludeAreas1 Rectangle[] 第一个文档要排除的区域数组。
ExcludeAreas2 Rectangle[] 第二个文档要排除的区域数组。
EditOperationsOrder EditOperationsOrder (enum) 应用插入/删除操作的顺序(默认是 DeleteFirst)。

DiffOperation

表示单个差异操作。包含:

属性 类型 描述
Operation Operation (enum) 操作类型(EqualDeleteInsert)。
Text string 与操作相关的文本。

ComparisonStatistics

描述
TextItemComparisonStatistics 单个文本(页面)的统计信息。包括总字符数、插入、删除的数量及相应的操作。
DocumentComparisonStatistics(继承自 TextItemComparisonStatistics 整个文档的扩展统计信息,包括 PagesStatistics 列表(每页统计信息)。

使用示例