Caché de relaciones de AcroForm
HotPDF mantiene un índice bidireccional local al documento en los campos AcroForm terminales, los nombres de campo calificados, las anotaciones de widget, los ordinales de widget y las posiciones de página
Comportamiento de búsqueda
La búsqueda por índice de campo y por nombre completo usa arrays directos y un mapa de nombres de direccionamiento abierto insensible a mayúsculas después de la primera construcción
Un campo padre puede aportar entradas /FT, /Ff y /Opt heredadas sin ser un campo terminal; los hijos con nombre, como group.a y group.b, siguen siendo campos indexados independientes
El índice de campos y la búsqueda por nombre calificado usan arreglos directos y un mapa de nombres de direccionamiento abierto sin distinción de mayúsculas y minúsculas después de la primera construcción
GetLoadedFormFieldWidgetPageIndex resuelve un ordinal de widget a su página, mientras que GetLoadedFormFieldIndexForAnnotation asigna una anotación de página de vuelta a su campo y ordinal de widget
La pertenencia a la matriz de anotaciones tiene prioridad sobre una entrada de widget /P, y la primera página coincidente en orden de documento gana para pertenencia duplicada malformada
Los widgets omitidos de /AcroForm /Fields se indexan como huérfanos para diagnóstico, pero no se exponen como campos de formulario sintéticos
Construcción y mutación
La caché se construye de forma diferida en un recorrido del árbol de campos más un recorrido de anotaciones de página
La creación de un campo cargado extiende una caché válida de forma incremental, mientras que la eliminación de campos, el cambio de nombre, el movimiento de widgets, la eliminación de anotaciones, el registro de fusiones, la fusión de campos XFA y la mutación del árbol de páginas la invalidan antes de que cambie el grafo
La siguiente consulta de relaciones reconstruye a partir del 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 los hermanos y sus ajustes heredados
Llame a InvalidateLoadedFormRelationshipCache después de modificar diccionarios AcroForm, de campo, de widget, /Annots de página, /Parent, /Kids o /P mediante APIs de objeto directas
Rendimiento y propiedad
El mapa de nombres y objetos mantiene su factor de carga por debajo de un medio y proporciona una búsqueda cálida en tiempo constante esperada
Una puerta de regresión construye 10,000 campos cargados, prueba 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 objetos no propietarios y el acceso al grafo del documento cargado permanece serializado por quien llama
Véase también: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics