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