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