property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom es el puente entre el recorrido de marcadores de bajo nivel de PDFium y el registro de alto nivel TBookmark. Siempre que obtenga un identificador FPDF_BOOKMARK directamente de PDFium (por ejemplo mediante FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling, o como parte de una prueba de acierto de clic en un visor), páselo por este indexador para recibir el texto del título resuelto, el PageNumber de destino, la clase de TPdfAction y cualquier ruta de archivo / URI asociada
El registro devuelto es una instantánea: lee el diccionario del marcador una vez y decodifica el destino en un número de página basado en 1. El identificador también se almacena en el registro, de modo que puede pasarlo de vuelta a las API de PDFium sin otro recorrido del árbol
Este indexador es la forma canónica de implementar un recorrido de esquema personalizado que necesita más control que Bookmarks (que enumera todo en profundidad primero) o BookmarkChildren (que solo devuelve los hijos directos). Mezcle identificadores PDFium sin procesar con la resolución de BookmarkFrom para construir, por ejemplo, una vista de árbol con carga diferida
| Handle | FPDF_BOOKMARK. Un identificador de marcador no nil obtenido de la API C de PDFium o de un campo TBookmark.Handle previo. Pasar nil devuelve un registro relleno con ceros. El identificador permanece válido solo mientras el documento subyacente esté cargado |
TBookmark — no llame a ninguna función de liberación de PDFium sobre él. PDFium libera automáticamente los identificadores del esquema cuando el documento se cierraAction resuelto usa el mismo enum TPdfAction que Bookmark y LinkAnnotation, de modo que el mismo código despachador puede enrutar por igual clics de entradas del esquema y de anotaciones de vínculoPageNumber se informa como 0. Use HasBookmarkChildren para decidir si expandir o navegar
procedure TForm1.DumpOutline(const Bm: TBookmark; Depth: Integer);
var
Child: FPDF_BOOKMARK;
Sub: TBookmark;
begin
Memo1.Lines.Add(StringOfChar(' ', Depth * 2) + Bm.Title +
Format(' -> page %d', [Bm.ActionPageNumber]));
Child := FPDFBookmark_GetFirstChild(Pdf1.Document, Bm.Handle);
while Child <> nil do
begin
Sub := Pdf1.BookmarkFrom[Child];
DumpOutline(Sub, Depth + 1);
Child := FPDFBookmark_GetNextSibling(Pdf1.Document, Child);
end;
end;