PDF文書の比較

すべての比較ツールは、Aspose.PDF.Drawingライブラリで利用可能です。

PDF文書を比較する方法

PDF文書を扱う際、2つの文書の内容を比較して違いを特定する必要がある場合があります。Aspose.PDF for .NETライブラリは、この目的のために強力なツールセットを提供します。この記事では、いくつかの簡単なコードスニペットを使用してPDF文書を比較する方法を探ります。

Aspose.PDFの比較機能を使用すると、2つのPDF文書をページごとに比較できます。特定のページまたは全体の文書を比較することを選択できます。結果として得られる比較文書は、違いを強調表示し、2つのファイル間の変更を特定しやすくします。

以下は、Aspose.PDF for .NETライブラリを使用してPDF文書を比較するための可能な方法のリストです:

  1. 特定ページの比較 - 2つのPDF文書の最初のページを比較します。

  2. 全体文書の比較 - 2つのPDF文書の全体の内容を比較します。

  3. PDF文書をグラフィカルに比較

  • GetDifferenceメソッドを使用してPDFを比較 - 変更がマークされた個々の画像。

  • CompareDocumentsToPdfメソッドを使用してPDFを比較 - 変更がマークされた画像を含むPDF文書。

特定ページの比較

最初のコードスニペットは、2つのPDF文書の最初のページを比較する方法を示しています。

  1. 文書の初期化。 コードは、それぞれのファイルパス(documentPath1とdocumentPath2)を使用して2つのPDF文書を初期化することから始まります。パスは現在空の文字列として指定されていますが、実際にはこれを実際のファイルパスに置き換えます。

  2. 比較プロセス。

  • ページ選択 - 比較は各文書の最初のページに制限されます(‘Pages[1]’)。
  • 比較オプション:

‘AdditionalChangeMarks = true’ - このオプションは、追加の変更マーカーが表示されることを保証します。これらのマーカーは、現在比較しているページにない場合でも、他のページに存在する可能性のある違いを強調表示します。

‘ComparisonMode = ComparisonMode.IgnoreSpaces’ - このモードは、テキスト内のスペースを無視し、単語内の変更のみに焦点を当てるように比較者に指示します。

  1. 2つのページ間の違いを強調表示する結果の比較文書は、‘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
            });
        }
    }
}

全体文書の比較

2つのPDF文書の全体の内容を比較するために、2番目のコードスニペットが範囲を拡大します。

// 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
                });
        }
    }
}

これらのスニペットによって生成された比較結果は、Adobe Acrobatなどのビューアで開くことができるPDF文書です。Adobe Acrobatで2ページ表示を使用すると、変更が並列に表示されます:

  • 削除 - これは左ページに記載されています。
  • 挿入 - これは右ページに記載されています。

‘AdditionalChangeMarks’を’true’に設定することで、現在表示されているページに変更がない場合でも、他のページで発生する可能性のある変更のマーカーを確認できます。

Aspose.PDF for .NETは、特定のページを比較する必要がある場合でも、全体の文書を比較する必要がある場合でも、PDF文書を比較するための堅牢なツールを提供します。‘AdditionalChangeMarks’やさまざまな’ComparisonMode設定’などのオプションを使用することで、比較プロセスを特定のニーズに合わせて調整できます。結果の文書は、変更の明確な並列表示を提供し、修正を追跡し、文書の正確性を確保するのを容易にします。

並列PDF文書比較器は、以下のクラスのオブジェクトとして比較結果を返します

クラス 目的 主要プロパティ 使用方法
SideBySideDocsComparisonResult 2つのPDF文書の並列比較の結果を表します。 * HasChanges – 変更が検出されたかどうかを示します。
* FirstDocChanges – 最初の文書バージョンのページごとにグループ化された変更のリスト。
* SecondDocChanges – 2番目の文書バージョンのページごとにグループ化された変更のリスト。
* FullChanges – すべての比較操作を含む変更の完全なシーケンスで、各要素は比較されたページのペアに対応します。
SideBySidePdfComparer.Compare(Document, Document, string, SideBySideComparisonOptions)メソッドによって返されます。インスタンスを取得した後、変更が存在するかどうかを確認できます(HasChanges)およびコレクションを反復して、どのページやフラグメントが変更されたかの詳細情報を取得できます。
SideBySidePagesComparisonResult 2つの個別のPDFページの並列比較の結果を表します。 * HasChanges – ページ間に違いが存在するかどうかを示します。
* FirstPageChanges – 最初のページで検出された変更のリスト。
* SecondPageChanges – 2番目のページで検出された変更のリスト。
* FullChanges – 2つのページ間の比較操作の完全なシーケンス。
SideBySidePdfComparer.Compare(Page, Page, string, SideBySideComparisonOptions)メソッドによって返されます。インスタンスを取得した後、変更が存在するかどうかを確認できます(HasChanges)およびコレクションを反復して、違いの完全なリストを取得できます。

詳細プロパティ

プロパティ 説明
HasChanges bool 少なくとも1つの違いが存在するかどうかを示します。
FirstDocChanges / FirstPageChanges List<List<EditContainer>> / List<EditContainer> 最初の(文書/ページ)で検出された変更を含みます。文書の場合、これはリストのリストであり、各ネストされたリストは単一のページに対応します。
SecondDocChanges / SecondPageChanges List<List<EditContainer>> / List<EditContainer> 2番目の(文書/ページ)で検出された変更を含みます。文書の場合、これはリストのリストであり、各ネストされたリストは単一のページに対応します。
FullChanges List<List<DiffOperation>> (文書)
List<DiffOperation> (ページ)
すべての比較操作の統合セット。文書の場合、これは2次元リストであり、各外部要素は比較されたページのペアに対応します。ページの場合、これは操作のフラットリストです。
DiffOperation (外部型) 特定の変更(挿入、削除、等価性)を説明します。

使用例

  // 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();

      // --- Comparing pages ----------------------------

      // Open PDF documents
      using (Document doc1 = new Document(dataDir + "ComparingEntireDocuments1.pdf"),
             doc2 = new Document(dataDir + "ComparingEntireDocuments2.pdf"))
      {
          // Compare
          SideBySidePagesComparisonResult pageResult = SideBySidePdfComparer.Compare(
              doc1.Pages[1],
              doc2.Pages[1],
              dataDir + "ComparingEntireDocuments_out.pdf",
              new SideBySideComparisonOptions
              {
                  AdditionalChangeMarks = false,
                  ComparisonMode = ComparisonMode.Normal
              });

          Console.WriteLine("=== Page Comparison ===");

          Console.WriteLine(pageResult.HasChanges ? "Changes were detected" : "No changes detected");

          Console.WriteLine($"First page changes count : {pageResult.FirstPageChanges.Count}");
          Console.WriteLine($"Second page changes count: {pageResult.SecondPageChanges.Count}");
          Console.WriteLine($"Total changes count      : {pageResult.FullChanges.Count}");
      }

      // --- Comparing documents ----------------------------

      // Open PDF documents
      using (Document doc1 = new Document(dataDir + "ComparingEntireDocuments1.pdf"),
             doc2 = new Document(dataDir + "ComparingEntireDocuments2.pdf"))
      {
          // Compare
          SideBySideDocsComparisonResult docResult = SideBySidePdfComparer.Compare(
              doc1,
              doc2,
              dataDir + "ComparingEntireDocuments_out.pdf",
              new SideBySideComparisonOptions
              {
                  AdditionalChangeMarks = false,
                  ComparisonMode = ComparisonMode.Normal
              });

          Console.WriteLine("\n=== Document Comparison ===");

          Console.WriteLine(docResult.HasChanges ? "Changes were detected" : "No changes detected");

          Console.WriteLine($"First document changes count : {Count(docResult.FirstDocChanges)} ");
          Console.WriteLine($"Second document changes count: {Count(docResult.SecondDocChanges)}");
          Console.WriteLine($"Total changes count          : {Count(docResult.FullChanges)}");
      }
  }

 private static int Count<T>(List<List<T>> list)
  {
      int count = 0;
      foreach (var innerList in list)
      {
          count += innerList.Count;
      }
      return count;
  }

EditContainerは、PDFページ(または文書)の比較中に検出された個々の変更を説明するヘルパーオブジェクトです。これは、変更識別子、変更タイプ、追加のマーカーフラグ、およびページ上の変更の正確な位置を示す幾何学的座標(長方形)を格納する「コンテナ」として機能します。

プロパティ 説明
Id int 変更の一意の識別子。これにより、比較結果の中で1つの変更を他の変更と区別できます。これは、ページ上の変更注釈で使用されます。
Operation DiffOperation 変更の性質を説明するdiff操作タイプ(挿入、削除、置換など)。
Rects List<Rectangle> ページ上の修正されたフラグメントをカバーする長方形領域のコレクション。

GraphicalPdfComparerを使用してPDF文書を比較する

文書でコラボレーションする際、特にプロフェッショナルな環境では、同じファイルの複数のバージョンができることがよくあります。

GraphicalPdfComparerクラスを使用してPDF文書やページを比較できます。このクラスは、ページのグラフィックコンテンツの変更を比較するのに適しています。

Aspose.PDF for .NETを使用すると、文書やページを比較し、比較結果をPDF文書または画像ファイルに出力できます。

次のクラスプロパティを設定できます:

  • 解像度 - 出力画像のDPI単位での解像度、および比較中に生成された画像の解像度。
  • 色 - 変更マークの色。
  • 閾値 - 変更の閾値(パーセント)。デフォルト値はゼロです。ゼロ以外の値を設定すると、あなたにとって重要でないグラフィックの変更を無視できます。

このクラスには、ページ画像の違いをさらに処理するのに適した形式で取得するためのメソッドがあります:ImagesDifference GetDifference(Page page1, Page page2)

このメソッドは、比較される最初のページの画像と違いの配列を含むImagesDifferenceクラスのオブジェクトを返します。違いの配列と元の画像は、RGB24bppピクセル形式を持っています。

ImagesDifferenceを使用すると、異なる画像を生成し、違いの配列を元の画像に追加することで、比較される2番目のページの画像を取得できます。これを行うには、ImagesDifference.GetDestinationImageおよびImagesDifference.DifferenceToImageメソッドを使用します。

GetDifferenceメソッドを使用してPDFを比較する

提供されたコードは、2つのPDF文書を比較し、それらの違いの視覚的表現を生成するGetDifferenceメソッドを定義しています。

このメソッドは、2つのPDFファイルの最初のページを比較し、2つのPNG画像を生成します:

  • 1つの画像(diffPngFilePath)は、ページ間の違いを赤で強調表示します。
  • もう1つの画像(destPngFilePath)は、宛先(2番目の)PDFページの視覚的表現です。

このプロセスは、文書の2つのバージョン間の変更や違いを視覚的に比較するのに役立ちます。

// 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を比較する

提供されたコードスニペットは、2つの文書を比較し、比較結果のPDFレポートを生成するCompareDocumentsToPdfメソッドを使用しています。

// 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クラスを使用して、文書や個々のページを比較できます。このクラスは、ページごとに文書を比較するか、単一の連続コンテンツストリーム(ページ分離なし)として比較することを可能にします。比較メソッドは、IStringOutputGeneratorまたはIFileOutputGeneratorインターフェースを実装する任意のクラスに渡すことができる違いの配列を返します。出力は、HTMLMarkdownPDF、およびJSONでサポートされています。また、ComparisonStatisticsクラスを使用して、実行された比較操作の統計を取得することもできます。

メソッド 説明 パラメータ 戻り値
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options) 2つのPDF文書をページごとに比較します。 * document1 – 最初の文書。
* document2 – 2番目の文書。
* 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) 2つの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) 2つの個別のページを比較します。 * page1 – 最初のページ。
* page2 – 2番目のページ。
* 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[] 2番目の文書のために除外される領域の配列。
EditOperationsOrder EditOperationsOrder (enum) 挿入/削除操作の適用順序(デフォルトはDeleteFirst)。

DiffOperation

単一の違い操作を表します。含まれています:

プロパティ 説明
Operation Operation (enum) 操作のタイプ(EqualDeleteInsert)。
Text string 操作に関連付けられたテキスト。

ComparisonStatistics

クラス 説明
TextItemComparisonStatistics 個々のテキスト(ページ)の統計。合計文字数、挿入、削除の数、および対応する操作を含みます。
DocumentComparisonStatistics (inherits from TextItemComparisonStatistics) 文書全体の拡張統計で、PagesStatisticsのリスト(ページごとの統計)を含みます。

使用例