property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom är bron mellan bokmärkesgenomgång på låg nivå i PDFium och posten TBookmark på hög nivå. Närhelst du erhåller ett FPDF_BOOKMARK-handtag direkt från PDFium (till exempel via FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling eller som en del av en klickträfftest i en visare), skicka det genom denna indexerare för att få den upplösta titeltexten, målets PageNumber, TPdfAction-typen samt eventuell associerad URI / filsökväg
Den returnerade posten är en ögonblicksbild: den läser bokmärkesordboken en gång och avkodar destinationen till ett ettbaserat sidnummer. Själva handtaget lagras också i posten så att du kan skicka tillbaka det till PDFium-API:er utan ännu en trädgenomgång
Denna indexerare är det kanoniska sättet att implementera en anpassad dispositionsgenomgång som kräver mer kontroll än Bookmarks (som räknar upp allt djupet först) eller BookmarkChildren (som enbart returnerar direkta barn). Kombinera råa PDFium-handtag med upplösning via BookmarkFrom för att till exempel bygga ett lat laddat trädvy
| Handle | FPDF_BOOKMARK. Ett bokmärkeshandtag som inte är nil, erhållet från PDFium C-API:et eller från ett tidigare TBookmark.Handle-fält. Att skicka nil returnerar en nollfylld post. Handtaget förblir giltigt endast medan det underliggande dokumentet är inläst |
TBookmark-posten — anropa inte någon PDFium-frigörelsefunktion på det. PDFium frigör dispositionshandtagen automatiskt när dokumentet stängsAction använder samma TPdfAction-enum som Bookmark och LinkAnnotation, så samma dispatcher-kod kan dirigera klick från både dispositionsposter och länkannoteringarPageNumber som 0. Använd HasBookmarkChildren för att avgöra om noden ska expanderas eller navigeras
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;