AcroForm relationship cache
O HotPDF mantém um índice bidirecional local do documento entre campos AcroForm terminais, nomes de campos qualificados, anotações de widget, ordinais de widget e posições de página
Comportamento de busca
A busca por índice de campos e por nome qualificado usa arrays diretos e um mapa de nomes open-addressed sem distinção de maiúsculas após a primeira construção
Um campo pai pode fornecer entradas /FT, /Ff e /Opt herdadas sem ser um campo terminal; campos filhos nomeados como group.a e group.b permanecem campos indexados separados
Campos filhos nomeados são distinguidos de widgets filhos sem nome, tanto quando o campo e o widget compartilham um dicionário quanto quando usam dicionários separados
GetLoadedFormFieldWidgetPageIndex resolve o ordinal de um widget até a sua página, enquanto GetLoadedFormFieldIndexForAnnotation mapeia uma anotação de página de volta ao campo e ao ordinal de widget correspondentes
A presença no array de anotações tem precedência sobre a entrada /P do widget, e a primeira página correspondente na ordem do documento vence quando houver associação duplicada malformada
Widgets ausentes de /AcroForm /Fields são indexados como órfãos para fins de diagnóstico, mas não são expostos como campos de formulário sintéticos
Construção e mutação
O cache é construído sob demanda em uma travessia da árvore de campos mais uma travessia das anotações de página
A criação de campo carregado estende um cache válido de forma incremental, enquanto remoção e renomeação de campos, movimento de widgets, remoção de anotações, registro de merge, fusão de campos XFA e mutação da tabela de páginas o invalidam antes que o grafo mude
A próxima consulta de relacionamento reconstrói a partir do grafo de objetos atual, incluindo widgets cuja entrada /P está ausente
Remover um filho terminal remove os widgets dele e a entrada na árvore de campos, mantendo os irmãos e as configurações herdadas deles
Chame InvalidateLoadedFormRelationshipCache depois de alterar por APIs de objeto brutas os dicionários de AcroForm, de campo, de widget ou de página /Annots, /Parent, /Kids e /P
Desempenho e posse
Os mapas de nomes e de objetos mantêm o fator de carga abaixo da metade e oferecem busca aquecida no tempo constante esperado
Um gate de regressão constrói 10.000 campos carregados, comprova a telemetria de travessia linear e exige que a busca repetida por nome seja pelo menos 100 vezes mais rápida que uma construção fria mais busca, no Win32 e no Win64
O cache armazena ponteiros de objeto sem posse e o acesso ao grafo do documento carregado permanece serializado pelo chamador
See also: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics