| categories |
|
||||
|---|---|---|---|---|---|
| date | 2026-03-06 | ||||
| description | GroupDocs.Comparison for .NET を使用したドキュメント比較時に、対象メタデータを保持する方法を学びましょう。C# の例を交えたステップバイステップガイドです。 | ||||
| keywords | preserve target metadata, GroupDocs.Comparison metadata preservation, .NET document comparison, metadata preservation tutorial | ||||
| lastmod | 2026-03-06 | ||||
| linktitle | Metadata Preservation Tutorial | ||||
| tags |
|
||||
| title | GroupDocs.Comparisonで対象メタデータを保持する – .NETチュートリアル | ||||
| type | docs | ||||
| url | /ja/net/advanced-comparison/groupdocs-comparison-net-metadata-target/ | ||||
| weight | 1 |
2つの文書を比較した際に重要なメタデータが失われたことはありませんか? あなただけではありません。.NET アプリケーションで文書を比較しながら preserve target metadata を保持する必要があると、作業が難しく感じるかもしれませんが、そうである必要はありません。
GroupDocs.Comparison for .NET を使用すると、比較結果に残すメタデータをどの文書にするか選択できます。文書管理システムを構築する場合でも、法的契約書を扱う場合でも、共同作業コンテンツを管理する場合でも、常に適切なソース文書のメタデータを取得したいでしょう。
このチュートリアルでは、比較中に preserve target metadata を保持する方法、一般的な落とし穴を回避する方法、そして実際のシナリオでの実装方法を学びます。
- “preserve target metadata” とは何ですか? 比較結果を生成する際に、ターゲットとして指定した文書のメタデータ(作成者、作成日、カスタムプロパティなど)を保持します。
- 必要な GroupDocs.Comparison のバージョンは? バージョン 25.4.0 以降。
- .NET Core でも使用できますか? はい – .NET Core 2.0+ または .NET Framework 4.6.1+。
- 本番環境でライセンスは必要ですか? 本番環境では商用ライセンスが必要です。学習目的であれば無料トライアルで動作します。
- PDF と DOCX でも機能しますか? はい – 主要な Office および PDF フォーマットはメタデータ保持をサポートしています。
コードに入る前に、なぜターゲットメタデータを保持することが重要かを説明します。文書メタデータは「あると便利」だけでなく、法的に要求されたりビジネス上重要だったりすることが多いです:
- Legal documents – 弁護士‑依頼者特権のマーカーを保持する必要があります。
- Corporate files – コンプライアンスタグや承認チェーンを保持しなければなりません。
- Academic papers – 著者の帰属と改訂履歴が必須です。
- Technical documentation – バージョン管理とレビュー状態が重要です。
適切に処理しないと、数か月かけて蓄積した情報が誤って削除される可能性があります。そこで 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 のインストールは簡単ですが、注意すべき点がいくつかあります。
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 は無料ではありませんが、選択肢があります:
- Free Trial – 30 日間フル機能が利用でき、評価に最適です。
- Temporary License – もっと時間が必要な場合の延長評価期間です。
- Commercial License – 本番利用向け(さまざまな価格プランがあります)。
学習中であれば今すぐライセンスを取得する必要はありません—トライアル版にはすべての 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 文を再確認してください。
本題です—文書比較中に実際にメタデータを保持します。ここが GroupDocs.Comparison の真価が発揮されるポイントです。
一般的な比較の流れは次の通りです:
- Source document がベースコンテンツを提供します。
- Target document が比較対象となる変更を提供します。
- output document が両方を統合しますが、どちらのメタデータが採用されるでしょうか?
デフォルトでは、GroupDocs.Comparison は source document のメタデータを使用します。preserve target metadata を行うには、API に明示的に指示する必要があります。
これにより、比較対象となる「ベースライン」文書が設定されます:
using (Comparer comparer = new Comparer(sourceFilePath))
{
// All comparison operations happen within this scope
}using 文を使用する理由: 大きな文書を処理する際にリソースを自動的に解放し、メモリリークを防ぎます。50 MB の Word ファイルを扱うときに後で感謝するでしょう。
比較対象となる変更が含まれる文書を comparer に指示します:
comparer.Add(targetFilePath);よくある間違い: source と target を取り違えることです。source は「元の文書」、target は「更新されたバージョン」と考えてください。
出力に保持するメタデータの文書を指定します:
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}");
}
}
}- File Path Issues – 常にフルパスを使用するか、ファイルが作業ディレクトリにあることを確認してください:
// Good
string sourceFile = Path.Combine(Directory.GetCurrentDirectory(), "docs", "source.docx");
// Risky (might work locally but fail in production)
string sourceFile = "source.docx";-
Memory Management – 大きな文書の場合は、常に
Comparerオブジェクトをusing文でラップしてください。 -
Version Compatibility – 異なる GroupDocs.Comparison のリリースではメタデータオプションが異なります。ベストな結果を得るには 25.4.0 以降を使用してください。
| シナリオ | Target メタデータを優先 | Source メタデータを優先 |
|---|---|---|
| Updated author info needed | ✅ | ❌ |
| Original document has legal precedence | ❌ | ✅ |
| Custom properties added only in the newer file | ✅ | ❌ |
| You want to keep the “master” document’s history | ❌ | ✅ |
複数のターゲットと比較できますが、最初に追加したターゲットのメタデータが保持されます:
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
});
}最も一般的な問題です。明示的なチェックでデバッグしてください:
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 はメモリ集中的です。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!バッチ処理 – 多数のファイルを比較する場合は、メモリ使用量を抑えるために小さなグループに分けて処理してください。
デスクトップまたは Web アプリでは、比較処理を非同期メソッドでラップします:
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;
}
});
}- Small (< 1 MB) – 直接処理。
- Medium (1‑10 MB) – UI の応答性を保つために進捗を表示。
- Large (> 10 MB) – 常に非同期処理を使用し、上記のように明示的な GC を検討してください。
以下は、2 つのアップロードファイルを受け取り、比較を実行し、preserve target metadata を保持した結果を返す、すぐに使用できるコントローラです:
[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 は最初に追加した target 文書のメタデータを使用します。保持したいメタデータを持つ文書を最初に追加してください。
Q: ターゲット文書にメタデータフィールドが欠けている場合はどうなりますか?
A: ターゲットに存在するメタデータだけが出力にコピーされます。欠けているフィールドは単に省略され、比較は正常に完了します。
Q: パスワード保護された文書はどう扱いますか?
A: パスワードを含む 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 サポートにお問い合わせいただけます。
- Official Documentation: GroupDocs.Comparison for .NET Docs
- API Reference: Complete API Reference
- Download Latest Version: GroupDocs Downloads
- Free Trial: Start Your Trial
- Purchase Options: Licensing and Pricing
最終更新日: 2026-03-06
テスト環境: GroupDocs.Comparison 25.4.0 for .NET
作者: GroupDocs