Cache delle relazioni AcroForm
HotPDF mantiene un indice bidirezionale locale al documento tra campi AcroForm terminali, nomi qualificati di campo, annotazioni widget, ordinali dei widget e posizioni di pagina
Comportamento di ricerca
Il lookup per indice di campo e nome qualificato usa array diretti e una mappa dei nomi open-addressed case-insensitive dopo la prima costruzione
Un campo padre può fornire voci ereditate /FT, /Ff, e /Opt senza essere un campo terminale; i figli con nome come group.a e group.b restano campi indicizzati separati
I campi figli con nome sono distinti dai figli widget senza nome, sia che campo e widget condividano un dizionario sia che usino dizionari separati
GetLoadedFormFieldWidgetPageIndex risolve un ordinale di widget sulla sua pagina, mentre GetLoadedFormFieldIndexForAnnotation mappa un'annotazione di pagina di nuovo al suo campo e ordinale di widget
L'appartenenza all'array di annotazioni ha precedenza sulla voce /P del widget e la prima pagina corrispondente in ordine di documento vince in caso di appartenenza duplicata non valida
I widget omessi da /AcroForm /Fields vengono indicizzati come orfani per la diagnostica ma non sono esposti come campi di sola lettura sintetici
Construction and mutation
La cache viene costruita pigramente in una singola traversata dell'albero dei campi più una traversata delle annotazioni di pagina
La creazione di campi caricati estende una cache valida in modo incrementale, mentre la rimozione di campi, la rinomina, lo spostamento dei widget, la rimozione di annotazioni, la registrazione di merge, l'unione di campi XFA e la mutazione della tabella di pagina la invalidano prima che il grafo cambi
La successiva query di relazione ricostruisce dal grafo di oggetti corrente, inclusi i widget la cui voce /P è assente
La rimozione di un figlio terminale rimuove i suoi widget e la sua voce nell'albero dei campi conservando i fratelli e le loro impostazioni ereditate
ChiamaInvalidateLoadedFormRelationshipCache dopo aver modificato i dizionari AcroForm, di campo, widget, /Annots, /Parent, /Kids o /P di pagina tramite le API a oggetti non elaborate
Prestazioni e proprietà
Le mappe di nomi e oggetti mantengono il fattore di carico sotto la metà e forniscono una ricerca a caldo con tempo costante previsto
Un gate di regressione costruisce 10.000 campi caricati, dimostra la telemetria di traversata lineare e richiede che la ricerca ripetuta per nome sia almeno 100 volte più veloce di un build a freddo più ricerca su Win32 e Win64
La cache memorizza puntatori agli oggetti non proprietari e l'accesso al grafo del documento caricato rimane serializzato per il chiamante
Vedi anche: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics