Document Comparison

THPDFDocComparison compara dos documentos THotPDF cargados y devuelve un reporte JSON determinista

Comparación estructural

cmStructural arranca en el catalog de cada documento, sigue las indirect references y asigna rutas a partir de claves de diccionario ordenadas e índices de arrays, como $Catalog/Pages/Kids[0]/Contents

Los valores escalares y los bytes de stream decodificados se hashean con SHA-256, así que los streams grandes se comparan incrementalmente sin materializar otra copia completa

Los objetos con la misma ruta pero distinta firma se reportan como objectChanged; las firmas iguales en rutas distintas son objectMoved; los objetos restantes sin emparejar son objectInserted u objectDeleted

Alineación de páginas

Las páginas con texto extraíble usan una firma de texto semántica para la alineación y hacen fallback a una firma estructural cuando el texto está vacío o no está disponible

Un pase de longest-increasing-subsequence preserva el orden de las páginas a través de inserciones y eliminaciones, mientras reporta el reordenamiento genuino como pageMoved

Las páginas alineadas sin pareja se convierten en pageChanged, pageInserted o pageDeleted; los metadatos de página se firman independientemente de /Parent, /Contents y /Resources para evitar el ruido de codificación de font subsets

Comparación renderizada

cmRenderedImage y cmFull renderizan las páginas comunes al DPI configurado y escanean cada bitmap una vez para calcular los píxeles cambiados, el ratio de píxeles cambiados, el error de color absoluto medio, el delta de color máximo y un puntaje de luminancia global tipo SSIM

THPDFRenderedCompareOptions selecciona diferencia RGB o de luminancia, tolerancia de color por píxel, similitud mínima, ratio máximo de píxeles cambiados, tamaño de tile, retención de regiones cambiadas, presupuestos de píxeles y overlays PNG opcionales

Una página es similar solo cuando pasan tanto la compuerta del ratio de píxeles cambiados como la de similitud; las métricas se evalúan a precisión completa y se redondean a seis decimales solo para el reporte JSON determinista

Los tiles cambiados se unen en regiones deterministas conexas por cuatro lados y se reportan con bounds en espacio de píxeles, conteos de píxeles cambiados y deltas de color máximos

Cuando los heatmaps están habilitados, los píxeles cambiados se mezclan de amarillo a rojo sobre el documento A y se guardan como archivos de estilo page-000001-diff.png en el directorio elegido por el caller

Límites y completitud

THPDFStructuralCompareLimits controla los límites de objetos, aristas, páginas, profundidad, diferencias, bytes de stream, bytes de valor y bytes de ruta

Si el recorrido alcanza un límite, el reporte incluye comparisonBudget, establece comparisonComplete en false y no puede reportar los documentos como idénticos

El trabajo renderizado se estima antes de la asignación y se acota por página y por comparación; los fallos de render, de asignación o de overlay añaden renderBudget o renderError, establecen renderComparisonComplete y comparisonComplete en false, y fallan de forma cerrada

Modos de comparación

Formato del resultado

El reporte incluye los conteos del source, la telemetría del recorrido, los límites estructurales y de render normalizados, differenceCount, reportedDifferenceCount, differencesTruncated, comparisonComplete, identical y un array differences

Los modos renderizados también devuelven un array renderedPages con estado de página, dimensiones, métricas, regiones cambiadas y rutas de overlay opcionales, más los conteos agregados de páginas y píxeles renderizados

Cada diferencia puede incluir valores pathA y pathB estables, índices de página, números de objeto, un tipo y una cadena de detalle

APIs relacionadas

THPDFDocComparison · CompareWithOptions · THPDFRenderedCompareOptions · THPDFComparisonMode · HPDFDocCompareDocuments