property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom ist die Brücke zwischen der Low-Level-PDFium-Outline-Traversierung und dem hochsprachlichen TBookmark-Record. Wann immer Sie ein FPDF_BOOKMARK-Handle direkt von PDFium erhalten (etwa über FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling oder als Teil eines Klick-Hit-Tests im Viewer), führen Sie es durch diesen Indexer, um den aufgelösten Titeltext, die Ziel-PageNumber, die TPdfAction-Art und eine zugeordnete URI bzw. einen Dateipfad zu bekommen
Der zurückgegebene Record ist ein Schnappschuss: Er liest das Lesezeichen-Dictionary einmal und dekodiert das Ziel in eine 1-basierte Seitennummer. Das Handle selbst liegt ebenfalls auf dem Record, sodass Sie es ohne erneuten Baum-Durchlauf wieder in PDFium-APIs einspeisen können
Dieser Indexer ist der kanonische Weg für eine eigene Outline-Traversierung, die mehr Kontrolle braucht als Bookmarks (zählt alles depth-first auf) oder BookmarkChildren (liefert nur direkte Kinder). Mischen Sie rohe PDFium-Handles mit der BookmarkFrom-Auflösung, um etwa einen lazy-load TreeView zu bauen
| Handle | FPDF_BOOKMARK. Ein Nicht-nil-Lesezeichen-Handle aus der PDFium-C-API oder aus einem früheren TBookmark.Handle-Feld. nil liefert einen nullgesetzten Record. Das Handle bleibt nur gültig, solange das zugrunde liegende Dokument geladen ist |
TBookmark-Record — rufen Sie darauf keine PDFium-Release-Funktion auf. PDFium gibt Outline-Handles beim Schließen des Dokuments automatisch freiAction-Feld verwendet denselben TPdfAction-Enum wie Bookmark und LinkAnnotation, sodass derselbe Dispatcher-Code Klicks aus Outline-Einträgen und Link-Annotationen gleichermaßen routen kannPageNumber als 0 gemeldet. Verwenden Sie HasBookmarkChildren, um über Aufklappen oder Navigieren zu entscheiden
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;