Кэш связей 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