계약서 비교
HPDFContractCompare는 로드된 두 PDF 문서의 시맨틱 텍스트와 라인 지오메트리를 비교하고, 문단을 맞추고, 감사 가능한 insert·delete·replace·move 레코드를 반환합니다
문구·조항 검토에는 이 헬퍼를 쓰고, 페이지·객체·렌더링 차이에는 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를 확인하세요
문단 맞춤과 변경
- 시맨틱 라인은 페이지·단(column)·목록·heading 경계와 설정 가능한 baseline 간격으로 묶고, 라인 사이 공백은 정규화합니다
- 완전히 같은 문단을 먼저 짝짓고, 반복되는 동일 본문 조항은 등장 순서와 다중성을 유지합니다
- 변경된 문단은 선택한 차이 granularity와 무관하게 설정 가능한 multiset 단어 유사도 점수로 맞춥니다
- 짝지어진 문단의 최장 증가 수열로 재배치를 찾아내며, insert·delete에서 오는 평범한 인덱스 이동을 move로 보고하지 않습니다
- 변경된 짝 문단은 한도가 있는 token alignment로 insert·delete·replace 레코드를 반환하고, 양쪽 문단 전체 context를 함께 담습니다
- 단어 모드는 문장부호를 단어에서 분리하고, 문장 모드는 공백이나 문단 끝이 뒤따르는 종결 마침표·느낌표·물음표로 자릅니다
- 문장 경계는 어휘 규칙만 보기 때문에 약어나 번호 붙은 조항 라벨을 잘라버릴 수 있습니다. 그래서 정밀한 법률 문구 검토에는 단어 모드가 기본입니다
JoinPageContinuations는 한 페이지 아래쪽의 끝나지 않은 문단을 다음 페이지 위쪽의 평범한 문단에 보수적으로 이어 붙이며, 호출자가 이 레이아웃 휴리스틱을 끌 수도 있습니다
페이지와 지오메트리 참조
PageIndex와 ParagraphIndex는 0부터 시작하고, CharacterStart는 공백 정규화된 문단 안에서 1부터 시작하는 UTF-16 위치입니다
문단 전체 insert·delete에서 없는 쪽은 페이지·문단 인덱스가 -1이고, 짝 문단 안의 token insert·delete는 반대쪽에 길이 0 위치를 유지합니다
각 사각형은 자신의 페이지 인덱스를 가지며 PDF user space에서 교차하는 시맨틱 라인을 덮습니다. 페이지에 걸친 문단은 여러 페이지에 사각형을 가질 수 있습니다
위치는 정확한 문자 사변형이 아니라 라인 커버리지로 기술되므로, 주석 PDF는 서로 다른 단어 변경 여럿에 같은 라인을 하이라이트할 수 있습니다
반복되는 페이지 머리글·바닥글과 상용구 제외
기본값은 각 입력의 서로 다른 최소 두 페이지에서 위·아래 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는 공백 정규화 뒤 리터럴 일치로 시맨틱 라인 전체를 제거하고, IgnoreCase를 존중하며, 정규식이나 부분 문자열 패턴은 절대 해석하지 않습니다
여백과 제외 항목은 신중히 고르세요. 제외된 반복 여백 라인 안의 날짜나 다른 계약 텍스트는 문구 검토에서 빠집니다
한도와 취소
| 옵션 | 기본값 | 범위 |
|---|---|---|
MaxPages | 500 | 문서마다 |
MaxParagraphs | 4000 | 제외를 적용한 뒤 문서마다 |
MaxSemanticLines | 50000 | 스냅샷·제외 이전의 결합 시맨틱 라인 |
MaxCharacters | 2000000 | 제외 이전의 결합 추출 라인 텍스트 |
MaxTokens | 200000 | 결합 단어 token, 문장 모드에서는 문장 token까지 |
MaxDifferences | 10000 | 반환 레코드, move 포함 |
MaxAlignmentCells | 2000000 | 누적 changed-paragraph token 행렬 |
MaxWorkUnits | 50000000 | 추출 정산과 alignment 작업 |
한도 초과는 ccsBudgetExceeded, 취소는 ccsCancelled를 반환하고, 부분 결과는 진단용으로 남고 HTML에서는 미완성으로 표시됩니다
취소는 페이지 추출 사이와 라이브러리 소유 alignment 루프 전체에서 검사하고, 바탕에 있는 단일 페이지 시맨틱 extractor는 동기 방식 그대로입니다
ccsInvalidInput은 없는 문서, 잘못된 enum ordinal, 잘못된 옵션을 보고하고, ccsExtractionFailed는 추출 가능한 텍스트가 없는 페이지나 실패한 시맨틱 추출을 보고합니다
추출 가능한 텍스트가 없는 페이지를 비교하려면 먼저 OCR이나 명시적인 빈 페이지 제거가 필요합니다. ccsComplete는 이 텍스트 비교의 완료만 보증합니다
검토 산출물
HPDFContractReviewHTML은 이스케이프된 제목, 메시지, 텍스트, 문단 전체 context, 변경 종류, 양쪽 소스 위치를 담은 독립 문서를 반환하고, 출력 한도는 기본 8388608 UTF-16 문자입니다
HTML exporter는 출력이 설정 한도를 넘으면 EHPDFContractCompareBudget을 던지고, cancellation token은 EHPDFOperationCancelled를 던집니다
HPDFSaveContractAnnotatedPDF는 완료된 보고서를 요구하고, 별도의 소스 문서를 로드하며, 번호 붙은 검토 코멘트와 하이라이트를 넣기 전에 정확한 라인 지오메트리까지 모든 시맨틱 페이지 스냅샷을 검사합니다
소스와 출력 경로는 서로 다르게 지정하고 ccsBefore나 ccsAfter를 고르세요. 문단 전체 delete와 insert를 함께 검토하려면 두 버전을 모두 내보내면 됩니다
Windows에서는 소스·출력 파일 identity를 검사해 소스 파일의 하드 링크나 다른 별칭을 거부합니다
PDF exporter는 AutoLaunch를 끄고 입력 문서와 소스 파일을 그대로 두며, 로드 전, 페이지·변경 사이, 저장 전에 취소를 검사합니다
이 헬퍼는 추출된 문구와 레이아웃 참조를 비교할 뿐, 법적 의미를 추론하거나 스캔 텍스트를 인식하거나 개정의 법적 효력을 보증하지 않습니다
관련 API
HPDFCompareContracts · THPDFContractCompareOptions · THPDFContractCompareReport · HPDFContractReviewHTML · HPDFSaveContractAnnotatedPDF