AcroForm リレーションシップキャッシュ

HotPDF は、端末の AcroForm フィールド、修飾フィールド名、ウィジェット注釈、ウィジェット序数、ページ位置にわたるドキュメントローカルの双方向インデックスを維持します

ルックアップの動作

フィールドインデックスと修飾名ルックアップは、初回構築後は直接配列と、大文字小文字を区別しないオープンアドレス法の名前マップを使用します

親フィールドは末端フィールドでなくても、継承される /FT・/Ff・/Opt エントリを提供できます。group.a や group.b などの名前付き子フィールドは、別々のインデックス付きフィールドのままです

名前付きの子フィールドは、フィールドとウィジェットが 1 つのディクショナリを共有していても別々のディクショナリを使っていても、名前のないウィジェットの子とは区別されます

GetLoadedFormFieldWidgetPageIndex はウィジェットの序数をそのページへ解決し、GetLoadedFormFieldIndexForAnnotation はページ上の注釈をフィールドとウィジェットの序数へ逆引きします

注釈配列への所属がウィジェットの /P エントリより優先されます。不正な形式の重複所属では、文書順で最初に一致したページが採用されます

/AcroForm /Fields から漏れたウィジェットは、診断のために孤児としてインデックス化されます。合成フォームフィールドとしては公開されません

構築と変更

キャッシュは、フィールドツリーの走査 1 回とページ注釈の走査 1 回を組み合わせて遅延構築されます

読み込み済みフィールドの作成は有効なキャッシュを漸進的に拡張します。一方、フィールドの削除・名前変更・ウィジェットの移動・注釈の削除・マージ登録・XFA フィールドのマージ・ページテーブルの変更は、グラフを変更する前にキャッシュを無効化します

次のリレーションシップ照会は、/P エントリを持たないウィジェットを含め、現在のオブジェクトグラフから再構築されます

末端の子を 1 つ削除すると、その子自身のウィジェットとフィールドツリーエントリが取り除かれます。兄弟フィールドとその継承設定は保持されます

生のオブジェクト API で AcroForm・フィールド・ウィジェット・ページの /Annots・/Parent・/Kids・/P の各ディクショナリを変更した後は、InvalidateLoadedFormRelationshipCache を呼び出してください

パフォーマンスと所有権

名前マップとオブジェクトマップは負荷率を半分未満に保ち、期待される定数時間のウォームルックアップを提供します

リグレッションゲートは 10,000 個のロード済みフィールドを構築し、線形走査テレメトリを証明し、反復的な名前ルックアップが Win32 および Win64 でコールド構築とルックアップよりも少なくとも 100 倍高速であることを要求します

キャッシュは非所有オブジェクトポインタを格納し、ロード済みドキュメントグラフへのアクセスは呼び出し元による直列化のままです

関連項目: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics