Кэш связей AcroForm
HotPDF поддерживает локальный для документа двунаправленный индекс по терминальным полям AcroForm, полным именам полей, виджет-аннотациям, порядковым номерам виджетов и позициям страниц
Поведение поиска
Поиск по индексу поля и полному имени после первой сборки использует прямые массивы и нечувствительную к регистру открытую хеш-карту имён
Родительское поле может давать наследуемые /FT, /Ff, и /Opt записи, не будучи терминальным полем; именованные дочерние поля, например group.a и group.b остаются отдельными индексируемыми полями
Поиск по индексу поля и полному имени после первой сборки использует прямые массивы и хеш-таблицу имён с открытой адресацией без учёта регистра
GetLoadedFormFieldWidgetPageIndex преобразует порядковый номер виджета в его страницу, а GetLoadedFormFieldIndexForAnnotation отображает аннотацию страницы обратно в её поле и порядковый номер виджета
Принадлежность аннотации массиву аннотаций имеет приоритет над записью /P виджета, а при некорректном дублировании членства побеждает первая совпавшая страница в порядке документа
Виджеты, отсутствующие в /AcroForm /Fields, индексируются как «осиротевшие» для диагностики, но не выдаются как синтетические поля формы
Построение и изменение
Кэш строится лениво: один обход дерева полей плюс один обход аннотаций страниц
Создание загруженного поля инкрементально расширяет валидный кэш, а удаление или переименование поля, перемещение виджета, удаление аннотации, регистрация слияния, объединение полей XFA и изменение таблицы страниц инвалидируют его до изменения графа
Следующий запрос о связях перестраивает кэш по текущему графу объектов, включая виджеты без записи /P
Удаление одного терминального потомка убирает его виджеты и запись в дереве полей, сохраняя соседей и их наследуемые настройки
Вызывайте InvalidateLoadedFormRelationshipCache после изменения словарей AcroForm, поля, виджета, страницы /Annots, /Parent, /Kids или /P через низкоуровневые объектные API
Производительность и владение
Таблицы имён и объектов удерживают load factor ниже половины и дают ожидаемый поиск за константное время на прогретом кэше
Регрессионный тест строит 10 000 загруженных полей, подтверждает линейность телеметрии обхода и требует, чтобы повторный поиск по имени был минимум в 100 раз быстрее холодной сборки с поиском на Win32 и Win64
Кэш хранит невладеющие указатели на объекты, а доступ к графу загруженного документа по-прежнему синхронизирует вызывающая сторона
См. также: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics