property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom 是底层 PDFium 书签遍历与高层 TBookmark 记录之间的桥梁。当你直接从 PDFium 获得 FPDF_BOOKMARK 句柄时(例如通过 FPDFBookmark_GetFirstChild、FPDFBookmark_GetNextSibling,或在查看器中作为点击命中测试的一部分),把它传入该索引器即可获得解析后的标题文本、目标 PageNumber、TPdfAction 种类以及关联的 URI / 文件路径
返回的记录是一个快照:它只读取一次书签字典,并把目标解码为从 1 开始的页码。句柄本身也存储在记录上,因此你可以把它传回 PDFium API,而无需再次遍历树
该索引器是实现自定义大纲遍历的规范方式,适用于需要比 Bookmarks(深度优先枚举所有条目)或 BookmarkChildren(只返回直接子节点)更多控制的场景。把原始 PDFium 句柄与 BookmarkFrom 解析混合使用,例如可以构建延迟加载的树视图
| Handle | FPDF_BOOKMARK。从 PDFium C API 或先前的 TBookmark.Handle 字段获得的非 nil 书签句柄。传入 nil 会返回全零记录。只有底层文档处于加载状态时句柄才保持有效 |
TBookmark 记录持有 — 不要对它调用任何 PDFium 释放函数。文档关闭时 PDFium 会自动释放大纲句柄Action 字段使用与 Bookmark 和 LinkAnnotation 相同的 TPdfAction 枚举,因此同一份分发代码可以同样处理来自大纲条目和链接注释的点击PageNumber 会报告为 0。使用 HasBookmarkChildren 来决定是展开还是导航
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;