はじめに
PDF は契約書、仕様書、レポート、規制提出書類の事実上の標準であり、複数のバージョンが流通しているため、2 つのファイル間で何が正確に変更されたかを素早く追跡するのは骨が折れます。文書を横に並べてスクロールし、手作業で差分に注釈を付ける方法は規模が拡大しませんし、Adobe Acrobat の Compare 機能のような専用ツールでさえ、ファイルごとに手動で介入する必要があります。
GroupDocs.Comparison for .NET を使用すれば、PDF 比較を完全にコードから実行でき、結果の表示方法を正確に選択できます。バージョン 26.4 では、3 つの出力表示モードを持つ専用の PdfCompareOptions クラスが導入されました。
- Inline (デフォルト) — 削除と挿入が同一ページ上で異なる色でハイライトされる単一の結合 PDF。これは従来の動作で、単体ファイルとして共有するのが最も簡単です。
- Side‑by‑Side — 各結果ページにソースページとターゲットページが横に並び、コンテンツが重ならないように表示されます。文書の差分が大きく、1 ページに混在させると混乱する場合に最適です。
- Interleaved — 結果は交互にページが配置されます。奇数ページはソース(削除がハイライト)、偶数ページはターゲット(挿入がハイライト)です。変更はネイティブ PDF アノテーションとして表現され、変更種別や作成者名といったメタデータを保持します。ほとんどの PDF ビューア(Adobe Acrobat Reader、Foxit など)はアノテーションパネルを開き、個々のアノテーションを受諾または削除できるため、余分なソフトウェアなしで軽量なレビュー作業が可能です。このファイルを「Two Page View」モードの PDF リーダーで開くと、自然な左右比較が得られます。
本記事では、3 つのモードすべてを実際の 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
- ライセンス ファイル (
GroupDocs.Comparison.lic)。ライセンスがない場合、ライブラリは透かしとページ数制限付きの評価モードで動作します。テスト用に temporary license をリクエストできます。 - 比較対象の 2 つの PDF ファイル — ここでは
source.pdfとtarget.pdfと呼びます。例:
source.pdf |
target.pdf |
|---|
モード 1: Inline 比較 (デフォルト)
使用シーン: 誰でも開けてすぐに変更点が分かる単一の自己完結型 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")だけでも同じ出力が得られます。
Inline モード の結果ドキュメント:
内部での処理内容:
- ソース文書から削除されたコンテンツは 1 色(デフォルトは赤)でハイライトされます。
- ターゲット文書から挿入されたコンテンツは別の色(デフォルトは緑)でハイライトされます。
- 変更点は同一ページ上に共存するため、結果はコンパクトですが、文書の差分が大きいと見た目がごちゃごちゃすることがあります。大幅なテキスト編集の場合、削除と挿入がページ上で物理的に重なり、置き換えられた段落が元の段落の上に表示されて読めなくなることがあります。そのようなケースでは
SideBySideまたはInterleavedモードの方が適しています。
モード 2: Side‑by‑Side 比較
使用シーン: 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);
}
Side‑by‑Side モード の結果ドキュメント:
内部での処理内容:
- 各結果ページは実質的に 2 分割された広いキャンバスです。
- 左側半分には削除がハイライトされたソースページが表示されます。
- 右側半分には挿入がハイライトされたターゲットページが表示されます。
- 2 文書のコンテンツは決して重ならないため、編集が激しいページでも読みやすさが保たれます。
モード 3: Interleaved 比較
使用シーン: 標準的な 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);
}
Interleaved モード の結果ドキュメント(Two Page View で表示):
内部での処理内容:
- 結果ドキュメントは
Nページのソース/ターゲットペアに対して2 × Nページを持ちます。 - 奇数ページ (1, 3, 5 …) は削除がハイライトされたソースページです。
- 偶数ページ (2, 4, 6 …) は挿入がハイライトされたターゲットページです。
AnnotationAuthorNameは比較中に生成された PDF アノテーションに作成者名を付与します。複数の作成者がコメントを残すレビュー ワークフローで、誰がどの変更を行ったかを区別したい場合に便利です。
ヒント: 結果を Adobe Acrobat Reader など View → Page Display → Two Page View をサポートするビューアで開くと、左/右のレイアウトが自動的に適用されます。
ページ範囲で比較を限定する
3 つのモードすべてで 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}");
}
詳細は公式 API リファレンスをご覧ください: 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 をリクエストしてください — クレジットカードは不要です。
よくある質問
Q: サーバーに Adobe Acrobat やその他の PDF ソフトウェアをインストールする必要がありますか?
A: いいえ。GroupDocs.Comparison はスタンドアロンの .NET ライブラリで、サードパーティの依存関係なしに PDF の読み書きが可能です。
Q: デフォルトでどの表示モードを使用すべきですか?
A: まずは Inline から始めてください。最もコンパクトな結果が得られ、共有が容易です。編集が多くてインライン表示が読みにくくなったら SideBySide に切り替え、レビュー担当者が「Two Page View」PDF リーダーで開く場合は Interleaved を使用します。
Q: PDF 以外の形式も比較できますか?
A: はい。ライブラリは Word 文書、Excel スプレッドシート、PowerPoint プレゼンテーション、プレーンテキストファイルなど多数の形式をサポートしています。完全な一覧は documentation にあります。
Q: ライセンスを設定しなかった場合はどうなりますか?
A: ライブラリは評価モードで動作し、出力文書に透かしが入り、最初の数ページしか処理されません。temporary license を取得すればテスト時のこれらの制限が解除されます。
Q: PDF 内の画像だけを比較し、テキスト変更は無視できますか?
A: PdfCompareOptions の CompareImagesPdf = true を使用して画像比較を有効にします。画像のみを対象にしたい場合は ImagesInheritanceMode プロパティと組み合わせて使用してください。詳細は API リファレンスをご参照ください。
結論
GroupDocs.Comparison for .NET 26.4 は、PDF 比較結果の表示方法をコードから正確に制御できる強力なツールです。Inline モードは最も一般的なユースケースである「単一の共有可能な赤字 PDF」を提供し、SideBySide は大幅な変更がある文書でも読みやすさを保ちます。Interleaved は任意の PDF ビューアの Two Page View と自然に連携し、ページ単位のフルサイズ比較を実現します。さらにページ範囲フィルタリングで必要なセクションだけを対象にでき、PdfCompareOptions が PDF 固有の設定を一元管理します。
ワークフローに合ったモードを選択するか、すべてのモードを生成して各関係者に好みのビューを選んでもらいましょう。