Comparação de contratos

HPDFContractCompare compara o texto semântico e a geometria de linhas de dois documentos PDF carregados, alinha parágrafos e retorna registros auditáveis de inserção, exclusão, substituição e movimentação

Use este helper para revisão de redação e cláusulas, e use THPDFDocComparison para diferenças de página, objeto e renderização

Compare contratos carregados

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;

Salve o HTML retornado usando UTF-8 e inspecione Report.Status e Report.Note quando a função de comparação retornar false

Alinhamento de parágrafos e alterações

Referências de página e geometria

O PageIndex e o ParagraphIndex são baseados em zero, enquanto o CharacterStart é uma posição UTF-16 baseada em um dentro do parágrafo com espaços em branco normalizados

Um lado ausente de uma inserção ou exclusão de parágrafo inteiro tem índices de página e parágrafo -1, e uma inserção ou exclusão de token dentro de um parágrafo pareado mantém uma posição de comprimento zero no lado oposto

Cada retângulo carrega seu próprio índice de página e cobre uma linha semântica que intersecta no espaço de usuário do PDF, e um parágrafo que atravessa páginas pode ter retângulos em várias páginas

As localizações descrevem cobertura de linha em vez de quadriláteros exatos de caracteres, então um PDF anotado pode destacar a mesma linha para várias alterações independentes de palavras

Excluir elementos recorrentes de página e boilerplate

Os padrões excluem linhas semânticas correspondentes que aparecem nos 54 pontos superiores ou inferiores em pelo menos duas páginas distintas de cada entrada, e normalizam os dígitos de margem para que números de página repetidos possam coincidir

Os documentos de antes e depois são filtrados de forma independente, e repetições no corpo permanecem elegíveis para comparação independentemente de quantas vezes ocorram

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.';

O ExcludedLineTexts remove uma linha semântica completa por igualdade literal depois da normalização de espaços em branco, respeita o IgnoreCase e nunca interpreta expressões regulares ou padrões de substring

Escolha margens e exclusões com critério, porque datas ou outro texto contratual dentro de uma linha recorrente de margem excluída ficam de fora da revisão de redação

Orçamentos e cancelamento

OpçãoPadrãoEscopo
MaxPages500Cada documento
MaxParagraphs4000Cada documento depois das exclusões
MaxSemanticLines50000Linhas semânticas combinadas antes de snapshots e exclusões
MaxCharacters2000000Texto de linha extraído combinado antes das exclusões
MaxTokens200000Tokens combinados de palavras e, no modo frase, de frases
MaxDifferences10000Registros retornados, incluindo movimentações
MaxAlignmentCells2000000Matrizes de tokens cumulativas de parágrafos alterados
MaxWorkUnits50000000Contabilidade de extração e trabalho de alinhamento

Um limite de orçamento retorna ccsBudgetExceeded, e o cancelamento retorna ccsCancelled, com achados parciais retidos para diagnóstico e marcados como incompletos no HTML

O cancelamento é verificado entre extrações de página e ao longo de todos os loops de alinhamento da biblioteca, enquanto o extrator semântico de página única subjacente permanece síncrono

O ccsInvalidInput reporta documentos ausentes, ordinais de enum inválidos ou opções inválidas, e o ccsExtractionFailed reporta páginas sem texto extraível ou com falha de extração semântica

OCR ou remoção explícita de páginas em branco é necessário antes de comparar páginas sem texto extraível, e o ccsComplete certifica apenas a conclusão desta comparação de texto

Artefatos de revisão

O HPDFContractReviewHTML retorna um documento standalone com título, mensagens, texto, contextos completos de parágrafo, tipos de alteração e ambas as localizações de origem devidamente escapados, com limite de saída de 8388608 caracteres UTF-16 por padrão

O exportador HTML lança EHPDFContractCompareBudget quando a saída excede o limite configurado, e o token de cancelamento dele lança EHPDFOperationCancelled

O HPDFSaveContractAnnotatedPDF exige um relatório concluído, carrega um documento de origem separado e verifica cada snapshot de página semântica, incluindo a geometria exata de linhas, antes de adicionar destaques com comentários de revisão numerados

Especifique caminhos distintos de origem e saída, selecione ccsBefore ou ccsAfter e exporte as duas versões quando precisar revisar exclusões e inserções de parágrafo inteiro juntas

No Windows, as identidades dos arquivos de origem e saída são verificadas para rejeitar hard links ou outros apelidos do arquivo de origem

O exportador PDF desativa o AutoLaunch, deixa os documentos de entrada e o arquivo de origem inalterados e verifica o cancelamento antes do carregamento, entre páginas e alterações e antes de salvar

Este helper compara a redação extraída e as referências de layout sem inferir significado jurídico, reconhecer texto digitalizado ou certificar o efeito legal de uma revisão

APIs relacionadas

HPDFCompareContracts · THPDFContractCompareOptions · THPDFContractCompareReport · HPDFContractReviewHTML · HPDFSaveContractAnnotatedPDF