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