Сравнение договоров
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 отсчитываются от нуля, а 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 и никогда не трактует регулярные выражения или шаблоны подстрок
Выбирайте поля и исключения обдуманно: даты или другой договорный текст внутри исключённой повторяющейся строки поля выпадут из проверки формулировок
Бюджеты и отмена
| Опция | По умолчанию | Охват |
|---|---|---|
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 возвращает автономный документ с экранированными заголовком, сообщениями, текстом, полными контекстами абзацев, видами изменений и обоими исходными местоположениями; лимит вывода по умолчанию — 8388608 символов UTF-16
HTML-экспортёр бросает EHPDFContractCompareBudget, когда вывод превышает настроенный лимит, а его токен отмены бросает EHPDFOperationCancelled
HPDFSaveContractAnnotatedPDF требует завершённого отчёта, загружает отдельный документ-источник и проверяет каждый семантический снимок страницы, включая точную геометрию строк, прежде чем добавить подсветки с нумерованными комментариями проверки
Укажите различные пути источника и вывода, выберите ccsBefore или ccsAfter, и экспортируйте обе версии, когда удаления и вставки целых абзацев нужно проверять вместе
В Windows идентичности исходного и выходного файлов проверяются, чтобы отклонить жёсткие ссылки и другие псевдонимы исходного файла
PDF-экспортёр отключает AutoLaunch, оставляет входные документы и исходный файл нетронутыми и проверяет отмену перед загрузкой, между страницами и изменениями и перед сохранением
Этот хелпер сравнивает извлечённые формулировки и ссылки на разметку, не выводя юридический смысл, не распознавая сканированный текст и не удостоверяя юридическую силу правки
Связанные API
HPDFCompareContracts · THPDFContractCompareOptions · THPDFContractCompareReport · HPDFContractReviewHTML · HPDFSaveContractAnnotatedPDF