GroupDocs.Comparison を使用した .NET でメタデータを保持する方法

このチュートリアルでは、GroupDocs.Comparison for .NET を使用して 2 つのドキュメントを比較する際に メタデータを保持する方法 を学びます。メタデータの保持は、法的コンプライアンス、監査トレイル、共同作業フローにとって重要であり、ライブラリは比較結果に残るドキュメントのメタデータを細かく制御できます。

はじめに

2つのドキュメントを比較した際に重要なメタデータが失われたことはありませんか? あなただけではありません。.NET アプリケーションでドキュメントを比較しながら ターゲットメタデータを保持 する必要があるとき、作業は難しく感じるかもしれませんが、そうである必要はありません。

GroupDocs.Comparison for .NET を使用すると、比較結果に残すメタデータをどのドキュメントにするか選択できます。ドキュメント管理システムの構築、法的契約の取り扱い、共同コンテンツの管理など、常に適切なソースドキュメントのメタデータを取得したいでしょう。

クイック回答

  • “preserve target metadata” は何を意味しますか? 比較結果を生成する際に、ターゲットとして指定したドキュメントのメタデータ(作者、作成日、カスタムプロパティなど)を保持します。
  • 必要な GroupDocs.Comparison のバージョンは? バージョン 25.4.0 以降。
  • .NET Core でも使用できますか? はい – .NET Core 2.0 以上または .NET Framework 4.6.1 以上。
  • 本番環境でライセンスは必要ですか? 本番環境では商用ライセンスが必要です。学習目的は無料トライアルで利用可能です。
  • PDF と DOCX でも機能しますか? はい – 主要な Office および PDF フォーマットはメタデータ保持をサポートしています。

メタデータ保持が重要な理由

コードに入る前に、ターゲットメタデータを保持する重要性について説明します。ドキュメントのメタデータは「あると便利」だけでなく、法的に要求されたりビジネス上重要だったりします。

  • 法的文書 – 弁護士‑クライアント特権のマーカーを保持する必要があります。
  • 企業ファイル – コンプライアンスタグや承認チェーンを保持しなければなりません。
  • 学術論文 – 著者の帰属や改訂履歴が必須です。
  • 技術文書 – バージョン管理やレビュー状態が重要です。

適切に処理しないと、数か月かけて蓄積した情報が誤って削除される可能性があります。そこで preserve target metadata オプションが活躍します。

前提条件

必要なライブラリとバージョン

  • GroupDocs.Comparison for .NET: バージョン 25.4.0 以降(以前のバージョンはメタデータオプションが制限されています)。
  • .NET Framework: 4.6.1 以上、または .NET Core 2.0+。

環境設定

  • Visual Studio(またはお好みの C# IDE)。
  • 基本的な C# の知識(高度なものは不要です、約束します!)。
  • テスト用のサンプルドキュメント 2 つ(Word .docx が最適です)。

知識の前提条件

GroupDocs の専門家である必要はありませんが、以下に慣れている必要があります:

  • C# の using 文とファイル操作。
  • 基本的なドキュメント処理の概念。
  • メタデータとは何か(作者、タイトル、カスタムプロパティなど)。

準備はできましたか?設定を始めましょう。

GroupDocs.Comparison for .NET の設定

GroupDocs.Comparison のインストールは簡単ですが、注意すべき点がいくつかあります。

インストールオプション

NuGet Package Manager Console(最も簡単な方法):

Install-Package GroupDocs.Comparison -Version 25.4.0

.NET CLI(コマンドラインが好みの場合):

dotnet add package GroupDocs.Comparison --version 25.4.0

プロのヒント: 予期しない破壊的変更を防ぐため、常にバージョンを指定してください。

ライセンス取得

ここで多くの開発者が最初に行き詰まります。GroupDocs.Comparison は無料ではありませんが、選択肢があります:

  • 無料トライアル – 30 日間フル機能、評価に最適です。
  • 一時ライセンス – もっと時間が必要な場合の延長評価期間。
  • 商用ライセンス – 本番利用向け(さまざまな価格プランあり)。

学習中であれば今すぐライセンスを取得する必要はありません—トライアル版はすべての preserve target metadata 機能を含んでいます。

基本設定の検証

簡単なテストで動作を確認しましょう:

using System.IO;
using GroupDocs.Comparison;

string sourceFilePath = "source.docx";
string targetFilePath = "target.docx";

// Initialize the Comparer object.
using (Comparer comparer = new Comparer(sourceFilePath))
{
    // Add the target document for comparison.
    comparer.Add(targetFilePath);
}

エラーなくコンパイルできれば準備完了です。エラーが出た場合は、パッケージのインストールと using 文を再確認してください。

ターゲットメタデータを保持する方法

ソースとターゲットのファイルを読み込み、API に最終出力でターゲットのメタデータを保持するよう指示します。

直接回答(40‑70語): ターゲットメタデータを保持するには、ソースドキュメントで Comparer をインスタンス化し、Add でターゲットドキュメントを追加、ComparisonOptionsCloneMetadataType = MetadataType.Target を設定し、最後に Compare を呼び出します。これにより、GroupDocs.Comparison はターゲットファイルの作者、作成日、カスタムプロパティなどすべてのメタデータを生成結果にコピーします。

メタデータのフローの理解

典型的な比較の流れは次の通りです:

  1. ソースドキュメント がベースコンテンツを提供します。
  2. ターゲットドキュメント が比較対象の変更を提供します。
  3. 出力ドキュメント が両方を統合しますが、どちらのメタデータが採用されるでしょうか?

デフォルトでは、GroupDocs.Comparison はソースドキュメントのメタデータを使用します。ターゲットメタデータを保持するには、API に明示的に指示する必要があります。

手順ごとの実装

手順 1: Comparer オブジェクトの初期化

Comparer は比較プロセスを統括するコアクラスです。ソースファイルを読み込み、変更を追跡し、出力を生成します。

using (Comparer comparer = new Comparer(sourceFilePath))
{
    // All comparison operations happen within this scope
}

なぜ using 文を使うのか? 大きなドキュメントを処理する際にリソースを自動的に解放し、メモリリークを防ぎます。50 MB の Word ファイルを扱うときに後で感謝するでしょう。

手順 2: ターゲットドキュメントの追加

Comparer.Add は比較対象となる変更を含むファイルを登録します。

comparer.Add(targetFilePath);

よくある間違い: ソースとターゲットを取り違えることです。ソースは「元の」ドキュメント、ターゲットは「更新された」バージョンと考えてください。

手順 3: メタデータタイプの設定(ここがポイント)

CloneMetadataTypeComparisonOptions のプロパティで、どのドキュメントのメタデータを結果にクローンするかを決定します。

comparer.Compare(outputFileName, new SaveOptions() { CloneMetadataType = MetadataType.Target });

何が起きているか? CloneMetadataType = MetadataType.Target は GroupDocs.Comparison に「最終結果にターゲットドキュメントのメタデータを保持したい」と指示します。

完全な動作例

以下は実行可能なプログラムの全体です:

using System;
using System.IO;
using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string sourceFile = "original_document.docx";
            string targetFile = "updated_document.docx";
            string outputFile = "comparison_result.docx";
            
            using (Comparer comparer = new Comparer(sourceFile))
            {
                comparer.Add(targetFile);
                
                // Preserve target document metadata
                comparer.Compare(outputFile, new SaveOptions() 
                { 
                    CloneMetadataType = MetadataType.Target 
                });
                
                Console.WriteLine($"Comparison completed! Check {outputFile}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error during comparison: {ex.Message}");
        }
    }
}

回避すべき一般的な落とし穴

  • ファイルパスの問題 – 常にフルパスを使用するか、ファイルが作業ディレクトリにあることを確認してください:
// Good
string sourceFile = Path.Combine(Directory.GetCurrentDirectory(), "docs", "source.docx");

// Risky (might work locally but fail in production)
string sourceFile = "source.docx";
  • メモリ管理 – 大きなドキュメントの場合は、常に Comparer オブジェクトを using 文でラップしてください。

  • バージョン互換性 – 異なる GroupDocs.Comparison のリリースではメタデータオプションが異なります。ベストな結果を得るには 25.4.0 以降を使用してください。

高度なメタデータシナリオ

ターゲットメタデータとソースメタデータを使い分けるタイミング

シナリオターゲット メタデータを優先ソース メタデータを優先
更新された著者情報が必要
元のドキュメントが法的優先権を持つ
カスタムプロパティが新しいファイルにのみ追加されている
“マスター”ドキュメントの履歴を保持したい

複数のターゲットドキュメントの取り扱い

最初に追加したターゲットのメタデータを保持したまま、複数のターゲットと比較できます:

using (Comparer comparer = new Comparer(sourceFilePath))
{
    comparer.Add(targetFilePath1);
    comparer.Add(targetFilePath2);
    comparer.Add(targetFilePath3);
    
    // Metadata will come from the first target document
    comparer.Compare(outputFileName, new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target 
    });
}

実用的な適用例とユースケース

法的文書管理

法律事務所では、特定のメタデータマーカーを保持しながら契約バージョンを比較する必要があることが多いです:

// Preserve client metadata from updated contract
using (Comparer comparer = new Comparer("original_contract.docx"))
{
    comparer.Add("client_revised_contract.docx");
    
    comparer.Compare("final_contract_comparison.docx", new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target  // Keep client's metadata
    });
}

学術・研究の共同作業

複数の研究者が共同作業する際、最新の著者情報を保持したいです:

// Keep metadata from the researcher's latest submission
using (Comparer comparer = new Comparer("draft_paper.docx"))
{
    comparer.Add("researcher_updates.docx");
    
    comparer.Compare("paper_comparison.docx", new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target  // Preserve researcher metadata
    });
}

企業コンプライアンスワークフロー

規制産業では、コンプライアンスメタデータの維持が重要です:

// Preserve compliance tags from updated policy document
using (Comparer comparer = new Comparer("old_policy.docx"))
{
    comparer.Add("compliance_approved_policy.docx");
    
    comparer.Compare("policy_comparison.docx", new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target  // Keep compliance metadata
    });
}

一般的な問題のトラブルシューティング

“File not found” エラー

最も一般的な問題です。明示的なチェックでデバッグしましょう:

string sourceFile = "source.docx";

// Always check if files exist before comparison
if (!File.Exists(sourceFile))
{
    Console.WriteLine($"Source file not found: {Path.GetFullPath(sourceFile)}");
    return;
}

// Same for target files
if (!File.Exists(targetFile))
{
    Console.WriteLine($"Target file not found: {Path.GetFullPath(targetFile)}");
    return;
}

大容量ドキュメントのメモリ問題

10 MB を超えるドキュメントの場合、以下の最適化を検討してください:

// Use explicit disposal for large documents
using (var comparer = new Comparer(sourceFile))
{
    comparer.Add(targetFile);
    
    var saveOptions = new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target 
    };
    
    comparer.Compare(outputFile, saveOptions);
    
    // Explicitly clean up
    GC.Collect();
    GC.WaitForPendingFinalizers();
}

権限とアクセスの問題

保護されたファイルやネットワーク共有を扱う場合:

try
{
    using (var comparer = new Comparer(sourceFile))
    {
        comparer.Add(targetFile);
        comparer.Compare(outputFile, new SaveOptions() 
        { 
            CloneMetadataType = MetadataType.Target 
        });
    }
}
catch (UnauthorizedAccessException ex)
{
    Console.WriteLine("Access denied. Check file permissions.");
    Console.WriteLine($"Details: {ex.Message}");
}
catch (IOException ex)
{
    Console.WriteLine("File I/O error occurred.");
    Console.WriteLine($"Details: {ex.Message}");
}

パフォーマンス上の考慮点とベストプラクティス

メモリ管理

GroupDocs.Comparison は 100 ページの PDF を処理する際、最大 300 MB の RAM を消費することがあります。using 文を使用して確実に解放し、メモリを速やかに解放してください。

// Good - automatic resource cleanup
using (var comparer = new Comparer(sourceFile))
{
    // comparison logic here
}

// Bad - potential memory leaks
var comparer = new Comparer(sourceFile);
// ... comparison logic
// comparer.Dispose(); // Easy to forget!

バッチ処理でドキュメントを処理 – 多数のファイルを比較する場合は、メモリ使用量を抑えるために小さなグループに分けて処理してください。

非同期操作で応答性向上

デスクトップまたはウェブアプリでは、比較処理を非同期メソッドでラップします:

public async Task<bool> CompareDocumentsAsync(string source, string target, string output)
{
    return await Task.Run(() =>
    {
        try
        {
            using (var comparer = new Comparer(source))
            {
                comparer.Add(target);
                comparer.Compare(output, new SaveOptions() 
                { 
                    CloneMetadataType = MetadataType.Target 
                });
                return true;
            }
        }
        catch
        {
            return false;
        }
    });
}

ファイルサイズのガイドライン

  • 小 (< 1 MB) – 直接処理。
  • 中 (1‑10 MB) – UI の応答性を保つために進捗を表示。
  • 大 (> 10 MB) – 常に非同期処理を使用し、上記のように明示的な GC を検討してください。

大規模システムとの統合

ASP.NET Core 統合

以下は、2 つのアップロードファイルを受け取り、比較を実行し、ターゲットメタデータを保持した結果を返す、すぐに使えるコントローラです:

[ApiController]
[Route("api/[controller]")]
public class DocumentComparisonController : ControllerBase
{
    [HttpPost("compare-with-target-metadata")]
    public async Task<IActionResult> CompareWithTargetMetadata(
        IFormFile sourceFile, 
        IFormFile targetFile)
    {
        var tempSource = Path.GetTempFileName();
        var tempTarget = Path.GetTempFileName();
        var outputPath = Path.GetTempFileName();
        
        try
        {
            // Save uploaded files temporarily
            await sourceFile.CopyToAsync(new FileStream(tempSource, FileMode.Create));
            await targetFile.CopyToAsync(new FileStream(tempTarget, FileMode.Create));
            
            // Perform comparison with target metadata preservation
            using (var comparer = new Comparer(tempSource))
            {
                comparer.Add(tempTarget);
                comparer.Compare(outputPath, new SaveOptions() 
                { 
                    CloneMetadataType = MetadataType.Target 
                });
            }
            
            // Return comparison result
            var resultBytes = await System.IO.File.ReadAllBytesAsync(outputPath);
            return File(resultBytes, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
                       "comparison_result.docx");
        }
        finally
        {
            // Clean up temporary files
            if (System.IO.File.Exists(tempSource)) System.IO.File.Delete(tempSource);
            if (System.IO.File.Exists(tempTarget)) System.IO.File.Delete(tempTarget);
            if (System.IO.File.Exists(outputPath)) System.IO.File.Delete(outputPath);
        }
    }
}

よくある質問

Q: 複数のターゲットドキュメントからメタデータを保持できますか?
A: 複数のターゲットファイルを追加した場合、GroupDocs.Comparison は 最初に 追加したターゲットドキュメントのメタデータを使用します。保持したいメタデータを持つドキュメントを最初に追加してください。

Q: ターゲットドキュメントにメタデータフィールドが欠けている場合はどうなりますか?
A: ターゲットに存在するメタデータだけが出力にコピーされます。欠けているフィールドは単に省略され、比較は正常に完了します。

Q: パスワード保護されたドキュメントはどう扱いますか?
A: LoadOptions でパスワードなどの設定を指定して保護されたドキュメントを開きます。パスワード付きの LoadOptions オブジェクトを作成し、Comparer コンストラクタに渡してください:

var loadOptions = new LoadOptions() { Password = "your_password" };
using (var comparer = new Comparer(sourceFile, loadOptions))
{
    // comparison logic here
}

Q: 特定のメタデータプロパティだけを保持する方法はありますか?
A: 現在の API は選択したソース(Target または Source)から すべて のメタデータを保持します。個別に制御したい場合は、比較後にプロパティを抽出し、手動で再適用する必要があります。

Q: どのドキュメント形式がメタデータ保持をサポートしていますか?
A: 一般的なビジネス形式(DOCX、PDF、PPTX、XLSX など)ほとんどがメタデータ保持をサポートしています。完全なリストは公式ドキュメントをご参照ください。

Q: 問題が発生した場合、どこでサポートを受けられますか?
A: コミュニティサポートは GroupDocs Support Forum をご利用ください。商用ライセンスをお持ちの場合は、直接 GroupDocs サポートにお問い合わせください。

追加リソース


最終更新日: 2026-09-15
テスト環境: GroupDocs.Comparison 25.4.0 for .NET
作者: GroupDocs


関連チュートリアル