Comparação de documentos JSON e C ABI

Compare dois documentos carregados através de THPDFJobProcessor.ExecuteLoadedOperationWithComparison, dois handles da C ABI através de hpdf_document_compare_json_v1, ou dois arquivos pelo job processor JSON

Modos genéricos

type=compare aceita valores de mode pageCount, pageText, objectCount, renderedImage, full e structural; o default é structural

Os modos retêm o comportamento nativo de THPDFDocComparison, incluindo alinhamento de páginas e assinaturas estruturais de objetos; objectCount também compara a estrutura de páginas e objetos

{
  "schemaVersion": 1,
  "type": "compare",
  "mode": "full",
  "render": {"dpi": 72, "colorSpace": "rgb", "colorTolerance": 8},
  "options": {"maxDifferences": 1000, "maxStreamBytes": 1048576},
  "budget": {"memoryBytes": 268435456, "resultBytes": 16777216,
             "outputBytes": 67108864, "timeMilliseconds": 60000, "pixels": 10000000}
}

O envelope de resultado inclui comparison, comparisonComplete, identical, documentUpdated=false, tempo decorrido e tamanho da saída; a saída binária opcional contém o JSON de comparação sem o envelope dele

Limites de traversal, streams, valores, diferenças retidas e rendering produzem status=incomplete, comparisonComplete=false e identical=false, mesmo quando o subconjunto inspecionado é igual

Revisão de contratos

type=compare.contract alinha parágrafos, detecta movimentações e reporta inserções, deleções e substituições de palavras ou frases, com contextos e localizações

{
  "schemaVersion": 1,
  "type": "compare.contract",
  "format": "pdf",
  "side": "after",
  "options": {"granularity": "word", "ignoreRepeatedHeadersFooters": true,
              "excludedLineTexts": ["CONFIDENTIAL COPY"], "maxWorkUnits": 50000000}
}

format aceita json, html ou pdf; JSON é o default, e HTML ou PDF exige um stream ou callback de saída

Os kinds de mudanças são insert, delete, replace e move; índices de páginas e parágrafos têm base zero, inícios de caracteres são posições UTF-16 com base um, e retângulos cobrem linhas semânticas no user space do PDF, em vez de quadriláteros exatos de glyphs

PDF seleciona side=before ou side=after, verifica o documento selecionado contra cada snapshot de página semântica, adiciona highlights e comentários Before/After, salva uma cópia de revisão e sempre reverte a transação do grafo da origem

Um PDF de revisão é uma reescrita completa e exige verificação de assinatura separada; a comparação deixa os documentos de origem emprestados e as assinaturas deles inalterados

Opções e limites

options genéricas aceita maxObjects, maxEdges, maxPages, maxDepth, maxDifferences, maxStreamBytes, maxTotalStreamBytes, maxValueBytes e maxPathBytes

Rendering aceita dpi, colorSpace (rgb ou luminance), colorTolerance, minimumSimilarity, maxChangedPixelRatio, tileSize e maxChangedRegions; operações de callbacks não gravam heatmaps no filesystem

options de contratos aceita os campos Booleanos, de margens, similaridade, boilerplate e recursos de THPDFContractCompareOptions, usando nomes camelCase; granularity é word ou sentence

Os orçamentos compartilhados são memoryBytes, outputBytes, resultBytes, timeMilliseconds, pixels, objectCount e pageCount; opções são limitadas a esses orçamentos

Orçamentos de memória alocam cotas conservadoras para ambos os paths de decode, pixels renderizados, armazenamento de alinhamento e saída privada; eles são limites de carga de trabalho, e não um teto de RSS do sistema operacional, e grafos de objetos já carregados permanecem de posse do chamador

A alocação JSON é checada com uma estimativa conservadora de tamanho escapado, que pode rejeitar um resultado cuja representação UTF-8 eventual caberia; HTML usa uma cota conservadora de caracteres dentro do orçamento de bytes de saída

Falhas de orçamento retornam status 8 da ABI e cancelamento retorna status 4; o cancelamento é cooperativo nas fronteiras de páginas, objetos, blocos de streams, objetos renderizados, linhas de pixels e alinhamento

O envelope de controle de erros da C ABI tem um máximo independente de 8 KiB e trunca detalhes para 1.024 code units UTF-16, permitindo que um erro de orçamento seja reportado quando o orçamento solicitado de resultados é pequeno demais para uma resposta de erro

Handles emprestados da C ABI

Carregue cada handle com sua própria origem hpdf_io_v1 e chame hpdf_document_compare_json_v1(handle_a, handle_b, operation); os layouts dos records v1 da ABI e o export original de execute permanecem inalterados

operation.input_io precisa ser NULL, result_io precisa fornecer write, e o output_io opcional fornece o artefato; chaves JSON de arquivos input, otherInput e output são rejeitadas

Ambas as origens independentes podem retornar leituras curtas de acesso aleatório, e ambos os callbacks de cancelamento são polled mesmo quando os objetos decodificados deles estão em cache; o mesmo handle pode ser fornecido duas vezes para auto-comparação

Mantenha os callbacks de entrada e os contextos deles vivos pelo tempo de vida do handle e das chamadas ativas, e serialize operações em cada handle; referências de handles são retidas até a comparação retornar

Artefatos são construídos e validados em buffers privados delimitados antes da publicação por callbacks; callbacks que falham durante a publicação podem reter bytes já aceitos, enquanto os documentos de origem permanecem inalterados

File jobs

{"operations":[{"type":"compare.contract","input":"before.pdf",
  "otherInput":"after.pdf","format":"html","output":"review.html"}]}

password e otherPassword desbloqueiam de forma independente os dois arquivos; a saída JSON pode omitir um path de saída e permanecer no envelope de resultado

Paths de saída precisam diferir de ambos os arquivos de origem, incluindo aliases existentes de hard links; um arquivo temporário no diretório de destino recebe flush e é publicado atomicamente depois que todas as checagens passam, preservando uma saída existente em falha

Tópicos relacionados

Comparação de documentos · Comparação de contratos · Export de streams anotados