Caché de relaciones AcroForm

HotPDF mantiene un índice bidireccional local al documento que abarca campos AcroForm terminales, nombres de campo calificados, anotaciones de widget, ordinales de widget y posiciones de página

Comportamiento de búsqueda

La búsqueda por índice de campo y por nombre cualificado usa arrays directos y un mapa de nombres de direccionamiento abierto insensible a mayúsculas tras la primera construcción

Un campo padre puede aportar entradas /FT, /Ff y /Opt heredables sin ser un campo terminal; los hijos con nombre, como group.a y group.b, siguen siendo campos indexados independientes

Los campos hijos con nombre se distinguen de los hijos widget sin nombre tanto si campo y widget comparten un diccionario como si usan diccionarios separados

GetLoadedFormFieldWidgetPageIndex resuelve un ordinal de widget a su página, mientras que GetLoadedFormFieldIndexForAnnotation mapea una anotación de página de vuelta a su campo y ordinal de widget

La pertenencia al array de anotaciones prevalece sobre la entrada /P de un widget, y la primera página coincidente en orden del documento gana en caso de pertenencia duplicada malformada

Los widgets ausentes de /AcroForm /Fields se indexan como huérfanos con fines de diagnóstico, pero no se exponen como campos de formulario sintéticos

Construcción y mutación

La caché se construye perezosamente en un recorrido del árbol de campos más un recorrido de anotaciones de página

La creación de campos cargados extiende una caché válida de forma incremental, mientras que la eliminación y el renombrado de campos, el movimiento de widgets, la eliminación de anotaciones, el registro de merge, la fusión de campos XFA y la mutación de la tabla de páginas la invalidan antes de que cambie el grafo

La siguiente consulta de relaciones se reconstruye desde el grafo de objetos actual, incluidos los widgets cuya entrada /P está ausente

Eliminar un hijo terminal elimina sus propios widgets y su entrada del árbol de campos conservando a sus hermanos y sus ajustes heredados

Llame a InvalidateLoadedFormRelationshipCache después de cambiar diccionarios AcroForm, de campo, de widget, de página /Annots, /Parent, /Kids o /P mediante APIs de objetos en bruto

Rendimiento y propiedad

Los mapas de nombres y de objetos mantienen su factor de carga por debajo de la mitad y proporcionan una búsqueda en caliente de tiempo constante esperado

Una puerta de regresión construye 10 000 campos cargados, demuestra la telemetría de recorrido lineal y exige que la búsqueda repetida de nombres sea al menos 100 veces más rápida que una construcción en frío más la búsqueda en Win32 y Win64

La caché almacena punteros de objeto sin propiedad y el acceso al grafo del documento cargado permanece serializado por el llamador

Véase también: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics