property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom est le pont entre la traversée de signets PDFium de bas niveau et l’enregistrement TBookmark de haut niveau. Chaque fois que vous obtenez un handle FPDF_BOOKMARK directement depuis PDFium (par exemple via FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling, ou dans le cadre d’un test de clic dans une visionneuse), transmettez-le à cet indexeur pour recevoir le texte de titre résolu, la PageNumber cible, le type TPdfAction et tout chemin URI / fichier associé
L’enregistrement renvoyé est un instantané: il lit une seule fois le dictionnaire du signet et décode la destination en numéro de page commençant à 1. Le handle lui-même est également stocké dans l’enregistrement afin que vous puissiez le renvoyer aux API PDFium sans parcourir à nouveau l’arbre
Cet indexeur est le moyen canonique d’implémenter une traversée de plan personnalisée qui a besoin de plus de contrôle que Bookmarks (qui énumère tout en profondeur d’abord) ou BookmarkChildren (qui ne renvoie que les enfants directs). Mélangez les handles PDFium bruts avec la résolution BookmarkFrom pour construire, par exemple, une vue arborescente à chargement paresseux
| Handle | FPDF_BOOKMARK. Un handle de signet non nul obtenu depuis l’API C PDFium ou depuis un champ TBookmark.Handle antérieur. Passer nil renvoie un enregistrement rempli de zéros. Le handle ne reste valide que pendant que le document sous-jacent est chargé |
TBookmark — n’appelez aucune fonction de libération PDFium dessus. PDFium libère les handles de plan automatiquement à la fermeture du documentAction résolu utilise le même enum TPdfAction que Bookmark et LinkAnnotation, donc le même code de distribution peut router les clics des entrées de plan et des annotations de lien de la même façonPageNumber est rapporté comme 0. Utilisez HasBookmarkChildren pour décider d’étendre ou de naviguer
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;