property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom é a ponte entre a travessia de bookmarks de baixo nível do PDFium e o record de alto nível TBookmark. Sempre que você obtiver um handle FPDF_BOOKMARK diretamente do PDFium (por exemplo por meio de FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling ou como parte de um teste de clique em um visualizador), passe-o por este indexador para receber o texto do título resolvido, o PageNumber de destino, o tipo de TPdfAction e qualquer URI / caminho de arquivo associado.
O record retornado é um snapshot: ele lê o dicionário do bookmark uma vez e decodifica o destino em um número de página baseado em 1. O próprio handle também é armazenado no record, de modo que você possa passá-lo de volta às APIs do PDFium sem outra varredura da árvore.
Este indexador é a forma canônica de implementar uma travessia de outline personalizada que exija mais controle do que Bookmarks (que enumera tudo em profundidade) ou BookmarkChildren (que retorna apenas filhos diretos). Misture handles brutos do PDFium com a resolução de BookmarkFrom para construir, por exemplo, um tree view de carregamento preguiçoso.
| Handle | FPDF_BOOKMARK. Um handle de bookmark não nil obtido da API C do PDFium ou de um campo TBookmark.Handle anterior. Passar nil retorna um record preenchido com zeros. O handle permanece válido apenas enquanto o documento subjacente estiver carregado. |
TBookmark — não chame nenhuma função de liberação do PDFium sobre ele. O PDFium libera os handles de outline automaticamente quando o documento é fechado.Action resolvido usa o mesmo enum TPdfAction de Bookmark e LinkAnnotation, de modo que o mesmo código despachante possa rotear cliques de entradas de outline e de anotações de link.PageNumber é reportado como 0. Use HasBookmarkChildren para decidir entre expandir ou navegar.
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;