契約書比較
HPDFContractCompare は、ロード済み 2 つの PDF ドキュメントのセマンティックテキストと行ジオメトリを比較し、段落を整列させ、監査可能な挿入・削除・置換・移動の各レコードを返します
文言と条項のレビューにはこのヘルパーを使い、ページ、オブジェクト、レンダリング結果の差分には THPDFDocComparison を使います
ロード済み契約書の比較
uses HPDFDoc, HPDFTypes, HPDFContractCompare;
Options := HPDFDefaultContractCompareOptions;
Options.Granularity := ccgWord;
BeforePDF.LoadFromFile('contract-before.pdf');
AfterPDF.LoadFromFile('contract-after.pdf');
if HPDFCompareContracts(BeforePDF, AfterPDF, Options, Report, Token) then
begin
HTML := HPDFContractReviewHTML(Report, 'Services agreement review',
8388608, Token);
HPDFSaveContractAnnotatedPDF('contract-before.pdf',
'contract-before-review.pdf', Report, ccsBefore, Token);
HPDFSaveContractAnnotatedPDF('contract-after.pdf',
'contract-after-review.pdf', Report, ccsAfter, Token);
end;
返された HTML は UTF-8 で保存し、比較関数が false を返したときは Report.Status と Report.Note を確認します
段落の整列と変更
- セマンティック行は、ページ、段組み、リストや見出しの境界、設定可能なベースラインギャップでグループ化され、行間の空白は正規化されます
- 完全一致する段落がまずペアになり、繰り返される同一の本文条項は出現順序と重複度を保ちます
- 変更された段落は、選択された差分の粒度には依存しない、設定可能な多重集合の単語類似度スコアでマッチします
- ペアになった段落の最長増加系列が並べ替えを特定し、挿入や削除による通常のインデックスずれを移動として報告しません
- 変更されたマッチ段落は境界付きトークン整列を使い、段落全体のコンテキストを両側に含む挿入・削除・置換レコードを返します
- 単語モードは句読点を単語から分離し、文モードは空白または段落末が続く終端のピリオド、感嘆符、疑問符で分割します
- 文の境界は語彙的な判定なので、省略表記や条項番号ラベルが分割されることがあります。正確な法務文言レビューでは単語モードがデフォルトです
JoinPageContinuationsは、あるページの下部近くで終わっていない段落を、次ページの上部近くにある平文段落へ保守的に連結します。このレイアウトヒューリスティックは無効化できます
ページとジオメトリの参照
PageIndex と ParagraphIndex は 0 起点で、CharacterStart は空白正規化済み段落内の 1 起点の UTF-16 位置です
段落全体の挿入や削除で存在しない側のページと段落のインデックスは -1 になり、マッチした段落内のトークン挿入や削除は反対側に長さゼロの位置を保ちます
各矩形は自身のページインデックスを運び、PDF ユーザー空間で交差するセマンティック行 1 行を覆います。ページをまたぐ段落は複数のページに矩形を持てます
位置情報は正確な文字の四角形ではなく行の被覆を表すので、注釈付き PDF では独立した複数の単語変更に対して同じ行がハイライトされることがあります
繰り返し現れるページ装飾と定型文の除外
デフォルトでは、各入力の 2 つ以上の異なるページで上端または下端 54 ポイント内に現れる一致するセマンティック行を除外し、繰り返されるページ番号が一致できるようマージンの数字を正規化します
before と after の各ドキュメントは独立してフィルタリングされ、本文の繰り返しは何度現れても比較対象のままです
Options.IgnoreRepeatedHeadersFooters := False;
Options.NormalizeMarginDigits := False;
Options.HeaderMarginPoints := 40;
Options.FooterMarginPoints := 35;
SetLength(Options.ExcludedLineTexts, 1);
Options.ExcludedLineTexts[0] :=
'The parties shall maintain an accurate register of approved subcontractors.';
ExcludedLineTexts は空白正規化後のリテラル一致でセマンティック行 1 行を丸ごと取り除き、IgnoreCase を尊重し、正規表現や部分文字列パターンは一切解釈しません
マージンと除外は意図的に選んでください。除外された繰り返しマージン行の中にある日付などの契約文は、文言レビューから漏れます
予算とキャンセル
| オプション | デフォルト | 対象 |
|---|---|---|
MaxPages | 500 | 各ドキュメント |
MaxParagraphs | 4000 | 除外後の各ドキュメント |
MaxSemanticLines | 50000 | スナップショットと除外の前の結合セマンティック行 |
MaxCharacters | 2000000 | 除外前の抽出済み行テキストの合計 |
MaxTokens | 200000 | 単語トークンの合計、文モードではさらに文トークンの合計 |
MaxDifferences | 10000 | 返されるレコード数(移動を含む) |
MaxAlignmentCells | 2000000 | 変更段落トークン行列の累積 |
MaxWorkUnits | 50000000 | 抽出の計上と整列の作業量 |
予算上限に達すると ccsBudgetExceeded、キャンセルされると ccsCancelled が返され、診断用に部分的な結果が保持され、HTML では未完了として印が付きます
キャンセルはページ抽出の合間と、ライブラリ所有の整列ループ全体でチェックされます。基盤の単一ページセマンティック抽出器は同期のままです
ccsInvalidInput はドキュメントの欠落、無効な列挙序数、無効なオプションを報告し、ccsExtractionFailed は抽出可能なテキストがないページやセマンティック抽出の失敗を報告します
抽出可能なテキストのないページを比較する前には OCR または明示的な空白ページ除去が必要で、ccsComplete が保証するのはこのテキスト比較の完了だけです
レビュー成果物
HPDFContractReviewHTML は、エスケープされたタイトル、メッセージ、テキスト、段落全体のコンテキスト、変更種別、両側のソース位置を含む自己完結ドキュメントを返し、既定の出力上限は 8388608 UTF-16 文字です
HTML エクスポーターは設定した上限を超えると EHPDFContractCompareBudget を送出し、そのキャンセルトークンは EHPDFOperationCancelled を送出します
HPDFSaveContractAnnotatedPDF は完了したレポートを要求し、別途ロードしたソースドキュメントを使い、番号付きレビューコメントのハイライトを追加する前に、正確な行ジオメトリを含むすべてのセマンティックページスナップショットを検査します
ソースと出力のパスは別々に指定し、ccsBefore か ccsAfter を選択します。段落全体の削除と挿入を併せてレビューするときは両方のバージョンをエクスポートします
Windows ではソースと出力ファイルの同一性が検査され、ハードリンクなどのソースファイルのエイリアスは拒否されます
PDF エクスポーターは AutoLaunch を無効化し、入力ドキュメントとソースファイルを変更せず、ロード前、ページ間と変更間、保存前にキャンセルをチェックします
このヘルパーは抽出された文言とレイアウト参照を比較するものであり、法的意味の推測、スキャンテキストの認識、改訂の法的効力の証明は行いません
関連 API
HPDFCompareContracts · THPDFContractCompareOptions · THPDFContractCompareReport · HPDFContractReviewHTML · HPDFSaveContractAnnotatedPDF