Comparación de contratos
HPDFContractCompare compara el texto semántico y la geometría de líneas de dos documentos PDF cargados, alinea párrafos y devuelve records auditables de inserción, eliminación, reemplazo y movimiento
Usen este helper para revisar redacción y cláusulas, y usen THPDFDocComparison para diferencias de página, de objetos y de render
Comparar contratos cargados
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;
Guarden el HTML devuelto usando UTF-8, e inspeccionen Report.Status y Report.Note cuando la función de comparación devuelva false
Alineación de párrafos y cambios
- Las líneas semánticas se agrupan usando límites de página, columna, lista o encabezado, y gaps de baseline configurables, con los espacios en blanco normalizados entre líneas
- Los párrafos exactos se emparejan primero, y las cláusulas de cuerpo idénticas repetidas conservan el orden de ocurrencia y la multiplicidad
- Los párrafos modificados se emparejan por un puntaje configurable de similitud de palabras tipo multiset, independiente de la granularidad de diferencias elegida
- Una subsecuencia creciente más larga de párrafos emparejados identifica reordenamientos sin reportar como moves los desplazamientos ordinarios de índices provocados por inserciones y eliminaciones
- Los párrafos emparejados con cambios usan una alineación de tokens acotada para devolver records de inserción, eliminación o reemplazo con ambos contextos completos de párrafo
- El modo por palabras separa la puntuación de las palabras, y el modo por oraciones usa punto final, signo de exclamación o signo de interrogación seguidos de espacios en blanco o del final del párrafo
- Los límites de oraciones son léxicos y pueden dividir abreviaturas o etiquetas numeradas de cláusulas, así que el modo por palabras es el predeterminado para una revisión precisa de la redacción legal
JoinPageContinuationsune de forma conservadora un párrafo sin terminar cerca del final de una página con un párrafo plano cerca del inicio de la página siguiente, y quienes llaman pueden deshabilitar esta heurística de layout
Referencias de página y de geometría
PageIndex y ParagraphIndex son de base cero, mientras que CharacterStart es una posición UTF-16 de base uno dentro del párrafo con espacios en blanco normalizados
El lado ausente de una inserción o eliminación de un párrafo completo tiene índices de página y de párrafo en -1, y una inserción o eliminación de token dentro de un párrafo emparejado conserva una posición de longitud cero en el lado opuesto
Cada rectángulo lleva su propio índice de página y cubre una línea semántica que se interseca en el espacio de usuario del PDF, y un párrafo que abarca varias páginas puede tener rectángulos en varias páginas
Las ubicaciones describen la cobertura de la línea en lugar de cuadriláteros exactos de caracteres, así que un PDF anotado puede resaltar la misma línea para varios cambios de palabras independientes
Excluir elementos recurrentes de página y boilerplate
Los valores predeterminados excluyen las líneas semánticas coincidentes que aparecen en los 54 puntos superiores o inferiores de al menos dos páginas distintas de cada entrada, y normalizan los dígitos de los márgenes para que los números de página repetidos puedan coincidir
Los documentos de antes y de después se filtran de forma independiente, y las repeticiones del cuerpo siguen siendo elegibles para comparación sin importar cuántas veces aparezcan
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 elimina una línea semántica completa por igualdad literal después de la normalización de espacios en blanco, respeta IgnoreCase y nunca interpreta expresiones regulares ni patrones de subcadenas
Elijan márgenes y exclusiones con criterio, porque las fechas u otro texto contractual dentro de una línea de margen recurrente excluida se omiten de la revisión de redacción
Presupuestos y cancelación
| Opción | Predeterminado | Alcance |
|---|---|---|
MaxPages | 500 | Cada documento |
MaxParagraphs | 4000 | Cada documento después de las exclusiones |
MaxSemanticLines | 50000 | Líneas semánticas combinadas antes de snapshots y exclusiones |
MaxCharacters | 2000000 | Texto de líneas extraído combinado antes de las exclusiones |
MaxTokens | 200000 | Tokens de palabras combinados y, en modo por oraciones, tokens de oraciones |
MaxDifferences | 10000 | Records devueltos, incluidos los moves |
MaxAlignmentCells | 2000000 | Matrices de tokens acumuladas de párrafos modificados |
MaxWorkUnits | 50000000 | Contabilidad de extracción y trabajo de alineación |
Un límite de presupuesto devuelve ccsBudgetExceeded y la cancelación devuelve ccsCancelled, con findings parciales retenidos para diagnóstico y marcados como incompletos en el HTML
La cancelación se verifica entre extracciones de páginas y a lo largo de los loops de alineación propios de la librería, mientras que el extractor semántico de una sola página subyacente permanece sincrónico
ccsInvalidInput reporta documentos ausentes, ordinales de enum inválidos u opciones inválidas, y ccsExtractionFailed reporta páginas sin texto extraíble o con extracción semántica fallida
Se requiere OCR o eliminación explícita de páginas en blanco antes de comparar páginas sin texto extraíble, y ccsComplete certifica únicamente la finalización de esta comparación de texto
Artefactos de revisión
HPDFContractReviewHTML devuelve un documento standalone con título escapado, mensajes, texto, contextos completos de párrafo, tipos de cambio y ambas ubicaciones de origen, con un límite de salida de 8388608 caracteres UTF-16 por defecto
El exportador HTML lanza EHPDFContractCompareBudget cuando su salida excede el límite configurado, y su token de cancelación lanza EHPDFOperationCancelled
HPDFSaveContractAnnotatedPDF exige un reporte completado, carga un documento de origen separado y verifica cada snapshot de página semántica, incluida su geometría exacta de líneas, antes de agregar resaltados con comentarios de revisión numerados
Especifiquen rutas de origen y de salida distintas, seleccionen ccsBefore o ccsAfter y exporten ambas versiones cuando necesiten revisar eliminaciones e inserciones de párrafos completas juntas
En Windows, se verifican las identidades de los archivos de origen y de salida para rechazar hard links u otros alias del archivo de origen
El exportador PDF deshabilita AutoLaunch, deja los documentos de entrada y el archivo de origen sin cambios, y verifica la cancelación antes de cargar, entre páginas y cambios, y antes de guardar
Este helper compara la redacción extraída y las referencias de layout sin inferir el significado legal, sin reconocer texto escaneado y sin certificar el efecto legal de una revisión
APIs relacionadas
HPDFCompareContracts · THPDFContractCompareOptions · THPDFContractCompareReport · HPDFContractReviewHTML · HPDFSaveContractAnnotatedPDF