Сравнение договоров

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

Выравнивание абзацев и изменения

Ссылки на страницы и геометрию

PageIndex и ParagraphIndex отсчитываются от нуля, а CharacterStart — позиция UTF-16 с отсчётом от единицы внутри абзаца с нормализованными пробелами

Отсутствующая сторона вставки или удаления целого абзаца имеет индексы страницы и абзаца -1, а вставка или удаление токена внутри сопоставленного абзаца сохраняет позицию нулевой длины на противоположной стороне

Каждый прямоугольник несёт собственный индекс страницы и покрывает пересекающую семантическую строку в PDF user space, а абзац, разбитый по страницам, может иметь прямоугольники на нескольких страницах

Местоположения описывают покрытие строк, а не точные четырёхугольники символов, поэтому аннотированный 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 и никогда не трактует регулярные выражения или шаблоны подстрок

Выбирайте поля и исключения обдуманно: даты или другой договорный текст внутри исключённой повторяющейся строки поля выпадут из проверки формулировок

Бюджеты и отмена

ОпцияПо умолчаниюОхват
MaxPages500Каждый документ
MaxParagraphs4000Каждый документ после исключений
MaxSemanticLines50000Суммарные семантические строки до снимков и исключений
MaxCharacters2000000Суммарный извлечённый текст строк до исключений
MaxTokens200000Суммарные токены слов и, в режиме предложений, предложений
MaxDifferences10000Возвращённые записи, включая перемещения
MaxAlignmentCells2000000Кумулятивные токен-матрицы изменённых абзацев
MaxWorkUnits50000000Учёт извлечения и работа выравнивания

Достижение лимита бюджета возвращает ccsBudgetExceeded, отмена — ccsCancelled, при этом частичные находки сохраняются для диагностики и помечаются как неполные в HTML

Отмена проверяется между извлечениями страниц и по всей длине библиотечных циклов выравнивания, тогда как лежащий в основе одностраничный семантический экстрактор остаётся синхронным

ccsInvalidInput сообщает об отсутствующих документах, недопустимых ординалах enum или недопустимых опциях, а ccsExtractionFailed — о страницах без извлекаемого текста или сбое семантического извлечения

Перед сравнением страниц без извлекаемого текста нужны OCR или явное удаление пустых страниц, а ccsComplete удостоверяет только завершение этого текстового сравнения

Артефакты проверки

HPDFContractReviewHTML возвращает автономный документ с экранированными заголовком, сообщениями, текстом, полными контекстами абзацев, видами изменений и обоими исходными местоположениями; лимит вывода по умолчанию — 8388608 символов UTF-16

HTML-экспортёр бросает EHPDFContractCompareBudget, когда вывод превышает настроенный лимит, а его токен отмены бросает EHPDFOperationCancelled

HPDFSaveContractAnnotatedPDF требует завершённого отчёта, загружает отдельный документ-источник и проверяет каждый семантический снимок страницы, включая точную геометрию строк, прежде чем добавить подсветки с нумерованными комментариями проверки

Укажите различные пути источника и вывода, выберите ccsBefore или ccsAfter, и экспортируйте обе версии, когда удаления и вставки целых абзацев нужно проверять вместе

В Windows идентичности исходного и выходного файлов проверяются, чтобы отклонить жёсткие ссылки и другие псевдонимы исходного файла

PDF-экспортёр отключает AutoLaunch, оставляет входные документы и исходный файл нетронутыми и проверяет отмену перед загрузкой, между страницами и изменениями и перед сохранением

Этот хелпер сравнивает извлечённые формулировки и ссылки на разметку, не выводя юридический смысл, не распознавая сканированный текст и не удостоверяя юридическую силу правки

Связанные API

HPDFCompareContracts · THPDFContractCompareOptions · THPDFContractCompareReport · HPDFContractReviewHTML · HPDFSaveContractAnnotatedPDF