property FormFieldInfoAt[X, Y: Single]: TPdfFormFieldInfo; // read only
FormFieldInfoAt は現在アクティブなページに対して hit-test を行い、(X, Y) にあるウィジェット注釈を記述する TPdfFormFieldInfo レコードを返します。座標は PDF user space で、原点はページ左下、単位はポイント(1/72 インチ)です。レコードの内容は FormFieldInfo[Index] の返すものと同じで、フィールドタイプ(fiTextField、fiCheckBox など)、フィールド名、別名、フラグ、オプションラベル、チェック状態、エクスポート値、フォントサイズが入ります
座標がどのウィジェット矩形にも入らない場合、FormFieldInfoAt はデフォルト初期化された TPdfFormFieldInfo を返します。FieldType = fiUnknown で文字列はすべて空です。完全なレコードを取り出す前に手軽な yes/no 判定が要るなら HasFormFieldAt[X, Y] を使うか、返された FieldType をそのまま確認してください
この検索はページのウィジェットに対して O(n) で、さらに Unicode のフィールドメタデータをデコードするため HasFormFieldAt より重い処理です。マウスムーブハンドラでは先に HasFormFieldAt を確認し、FormFieldInfoAt はクリックか hover-enter のときだけ呼びます。マウス位置からの座標は、デバイスピクセルをページ単位へ変換するためにまず TPdfView.PointToPage を通してください
/Annots の最後の entry が勝ちます)FieldType = fiSignature になります。SignatureCount と組み合わせれば署名状態を別途列挙できますFormFieldAt によるウィジェット変更はキャッシュ済みレコードを無効化します。書き込むたびに読み直してください
procedure TForm1.PdfView1Click(Sender: TObject);
var Info: TPdfFormFieldInfo;
PageX, PageY: Double;
begin
PdfView1.PointToPage(Mouse.CursorPos.X, Mouse.CursorPos.Y, PageX, PageY);
Info := Pdf1.FormFieldInfoAt[PageX, PageY];
if Info.FieldType <> fiUnknown then
ShowMessage(Info.Name);
end;