property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom è il ponte tra l'attraversamento dei segnalibri PDFium di basso livello e il record TBookmark di alto livello. Ogni volta che ottieni un handle FPDF_BOOKMARK direttamente da PDFium (per esempio tramite FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling, o come parte di un hit-test di clic in un viewer), passalo a questo indicizzatore per ricevere il testo del titolo risolto, il PageNumber di destinazione, il tipo TPdfAction e l'eventuale URI / percorso file associato
Il record restituito è uno snapshot: legge il dizionario del segnalibro una sola volta e decodifica la destinazione in un numero di pagina a base uno. L'handle stesso è memorizzato nel record, così puoi passarlo di nuovo alle API PDFium senza un'altra scansione dell'albero
Questo indicizzatore è il modo canonico per implementare un attraversamento personalizzato della struttura che richiede più controllo di Bookmarks (che enumera tutto in profondità) o BookmarkChildren (che restituisce solo i figli diretti). Mescola handle PDFium grezzi con la risoluzione di BookmarkFrom per costruire, per esempio, una tree view a caricamento lazy
| Handle | FPDF_BOOKMARK. Un handle di segnalibro non nil ottenuto dalla API C di PDFium o da un campo TBookmark.Handle precedente. Passare nil restituisce un record azzerato. L'handle resta valido solo finché il documento sottostante è caricato |
TBookmark — non chiamare su di esso alcuna funzione di rilascio PDFium. PDFium libera automaticamente gli handle della struttura alla chiusura del documentoAction risolto usa lo stesso enum TPdfAction di Bookmark e LinkAnnotation, così lo stesso codice dispatcher può instradare i clic sia dalle voci della struttura sia dalle annotazioni linkPageNumber viene riportato come 0. Usa HasBookmarkChildren per decidere se espandere o navigare
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;