property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom je most medzi prechádzaním záložiek PDFium na nízkej úrovni a záznamom TBookmark na vysokej úrovni. Kedykoľvek získate handle FPDF_BOOKMARK priamo z PDFium (napríklad cez FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling alebo ako súčasť hit-testu kliknutia v prehliadači), odovzdajte ho týmto indexerom, aby ste dostali rozlíšený text názvu, cieľové PageNumber, druh TPdfAction a prípadnú pridruženú URI / cestu k súboru.
Vrátený záznam je snímok: raz prečíta slovník záložky a dekóduje cieľ do 1-základného čísla strany. Samotný handle je tiež uložený v zázname, takže ho môžete odovzdať späť do API PDFium bez ďalšieho prechodu stromom.
Tento indexer je kanonický spôsob implementácie vlastného prechodu osnovy, ktorý potrebuje viac kontroly než Bookmarks (ktoré vymenúvajú všetko do hĺbky) alebo BookmarkChildren (ktoré vracajú iba priame potomky). Zmiešajte surové handly PDFium s rozlíšením BookmarkFrom na vytvorenie napríklad stromového zobrazenia s lenivým načítavaním.
| Handle | FPDF_BOOKMARK. Handle záložky nie-nil získaný z C API PDFium alebo z predchádzajúceho poľa TBookmark.Handle. Odovzdanie nil vráti nulou vyplnený záznam. Handle zostáva platný iba kým je podkladový dokument načítaný. |
TBookmark — nevolajte naň žiadnu funkciu uvoľnenia PDFium. PDFium uvoľňuje handly osnovy automaticky pri zatvorení dokumentu.Action používa rovnaký enum TPdfAction ako Bookmark a LinkAnnotation, takže rovnaký kód dispečera môže smerovať kliknutia z položiek osnovy aj z anotácií prepojení.PageNumber sa nahlási ako 0. Použite HasBookmarkChildren na rozhodnutie, či rozbaľovať alebo navigovať.
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;