AcroForm 關聯快取

HotPDF 在終端 AcroForm 欄位、限定欄位名稱、表單物件註解、表單物件序數與頁面位置之間維護以文件為範圍的雙向索引

查詢行為

Field index and qualified-name lookup use direct arrays and a case-insensitive open-addressed name map after the first build

A parent field may provide inherited /FT, /Ff, and /Opt entries without being a terminal field; named children such as group.a and group.b remain separate indexed fields

欄位索引與限定名稱查詢在初次建置之後會使用直接陣列與大小寫不敏感的開放定址名稱對應表

GetLoadedFormFieldWidgetPageIndex 會將某一個表單物件序數解析到其頁面,而 GetLoadedFormFieldIndexForAnnotation 則會將頁面註解對應回其欄位與表單物件序數

註解陣列的成員資格優先於表單物件的 /P 項目,而對於格式錯誤的重複成員資格,文件中順序最先相符的頁面勝出

未包含在 /AcroForm /Fields 中的表單物件會作為孤兒建立索引以利診斷,但不會被公開為合成的表單欄位

建置與變更

快取會以一次欄位樹遍歷加上一次頁面註解遍歷的方式惰性建置

已載入欄位的建立會遞增擴展現有的有效快取,而欄位移除、重新命名、表單物件移動、註解移除、合併註冊、XFA 欄位合併與頁面表格變更都會在圖形變更之前使其失效

下一次關聯查詢會從目前的物件圖形重建,包括 /P 項目缺席的表單物件

通過原始物件 API 變更 AcroForm、欄位、表單物件、頁面

Call /Annots、/Parent、/Kids 或 /P 字典之後,呼叫 InvalidateLoadedFormRelationshipCache

效能與擁有權

名稱與物件對應表將其負載因數保持在二分之一以下,並提供預期的常數時間暖查詢

回歸閘會建置 10,000 個已載入欄位、證明線性遍歷遙測,並要求重複名稱查詢在 Win32 與 Win64 上至少要比冷建置加上查詢快 100 倍

快取儲存非擁有的物件指標,而已載入文件的圖形存取仍維持由呼叫端序列化

另請參閱: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics