合約比較
HPDFContractCompare 比較兩份已載入 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 使用者空間中一條相交的語意行;跨頁段落可能在多個頁面上都有矩形
位置描述的是行涵蓋範圍,而非精確的字元四邊形,因此帶註解的 PDF 可能為幾個獨立的字詞變更高亮同一行
排除反覆出現的頁面固定元素與樣板文字
預設會排除在每份輸入至少兩個不同頁面的頂部或底部 54 點內出現的相符語意行,並將邊界數字正規化,讓重複的頁碼可以互相匹配
前後兩份文件各自獨立過濾,本文中的重複內容無論出現幾次都仍會參與比較
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 在空白正規化後以字面相等移除整條語意行,遵守 IgnoreCase,絕不會解讀正規表示式或子字串模式
邊界與排除條件請審慎設定,因為被排除的反覆邊界行裡若夾帶日期或其他合約文字,就不會進入用詞審閱
預算與取消
| 選項 | 預設 | 範圍 |
|---|---|---|
MaxPages | 500 | 每份文件 |
MaxParagraphs | 4000 | 每份文件排除後 |
MaxSemanticLines | 50000 | 快照與排除之前的合計語意行 |
MaxCharacters | 2000000 | 排除之前的合計擷取行文字 |
MaxTokens | 200000 | 合計字詞符記,句子模式下另含句子符記 |
MaxDifferences | 10000 | 傳回的記錄數,含移動 |
MaxAlignmentCells | 2000000 | 變更段落符記矩陣的累計值 |
MaxWorkUnits | 50000000 | 擷取計量與對齊工作 |
觸及預算上限時傳回 ccsBudgetExceeded,取消時傳回 ccsCancelled;部分發現會保留供診斷,並在 HTML 中標記為不完整
取消權杖會在每次頁面擷取之間以及程式庫自有的對齊迴圈全程檢查,底層的單頁語意擷取器則維持同步
ccsInvalidInput 回報文件遺漏、非法的 enum 序數或無效選項;ccsExtractionFailed 回報沒有可擷取文字或語意擷取失敗的頁面
要比較沒有可擷取文字的頁面,必須先做 OCR 或明確移除空白頁;ccsComplete 只證明這次文字比較本身已完成
審閱產出物
HPDFContractReviewHTML 傳回獨立的 HTML 文件,含跳脫後的標題、訊息、文字、完整段落上下文、變更類型與兩側來源位置,輸出上限預設為 8388608 個 UTF-16 字元
HTML 匯出器在輸出超過設定上限時拋出 EHPDFContractCompareBudget,其取消權杖被觸發時拋出 EHPDFOperationCancelled
HPDFSaveContractAnnotatedPDF 要求報告已完成,會另外載入來源文件,並在加入帶編號審閱意見的高亮之前,逐頁核對語意頁面快照與精確的行幾何
來源與輸出路徑必須不同,並選擇 ccsBefore 或 ccsAfter;需要同時審閱整段刪除與整段插入時,兩個版本都請匯出
在 Windows 上會檢查來源與輸出檔案身分,拒絕硬連結或其他來源檔案別名
PDF 匯出器會停用 AutoLaunch、不更動輸入文件與來源檔案,並在載入前、頁面與變更之間以及儲存前檢查取消
這個輔助函式只比較擷取出的用詞與版面參照,不推論法律意義、不辨識掃描文字,也不為任何修訂的法律效力背書
相關 API
HPDFCompareContracts · THPDFContractCompareOptions · THPDFContractCompareReport · HPDFContractReviewHTML · HPDFSaveContractAnnotatedPDF