property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom jest pomostem między niskopoziomowym przechodzeniem zakładek PDFium a wysokopoziomowym rekordem TBookmark. Za każdym razem, gdy uzyskasz uchwyt FPDF_BOOKMARK bezpośrednio z PDFium (na przykład przez FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling lub w ramach testu trafienia kliknięcia w przeglądarce), przekaż go przez ten indeksator, aby otrzymać rozstrzygnięty tekst tytułu, docelowy PageNumber, rodzaj TPdfAction oraz skojarzony URI / ścieżkę pliku
Zwrócony rekord jest migawką: odczytuje słownik zakładki raz i dekoduje miejsce docelowe na numer strony liczony od jedzynki. Sam uchwyt również jest przechowywany w rekordzie, więc można przekazać go z powrotem do API PDFium bez kolejnego przechodzenia drzewa
Ten indeksator to kanoniczny sposób implementacji niestandardowego przechodzenia konspektu, które wymaga większej kontroli niż Bookmarks (wyliczające wszystko w głąb) czy BookmarkChildren (zwracające tylko bezpośrednie elementy potomne). Łącz surowe uchwyty PDFium z rozstrzyganiem BookmarkFrom, aby zbudować na przykład drzewo z leniwym ładowaniem
| Handle | FPDF_BOOKMARK. Niepusty uchwyt zakładki uzyskany z API C PDFium lub z poprzedniego pola TBookmark.Handle. Przekazanie nil zwraca rekord wypełniony zerami. Uchwyt pozostaje ważny tylko wtedy, gdy dokument bazowy jest wczytany |
TBookmark — nie wywołuj na nim żadnej funkcji zwalniającej PDFium. PDFium zwalnia uchwyty konspektu automatycznie przy zamykaniu dokumentuAction używa tego samego typu wyliczeniowego TPdfAction co Bookmark i LinkAnnotation, więc ten sam kod dyspozytora może kierować kliknięciami z wpisów konspektu i adnotacji linkówPageNumber jest zgłaszany jako 0. Użyj HasBookmarkChildren, aby zdecydować, czy rozwinąć, czy nawigować
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;