property BookmarkFrom[Handle: FPDF_BOOKMARK]: TBookmark; // read only
BookmarkFrom는 저수준 PDFium 북마크 순회와 고수준 TBookmark 레코드를 잇는 다리입니다. PDFium에서 FPDF_BOOKMARK 핸들을 직접 얻었다면(예: FPDFBookmark_GetFirstChild, FPDFBookmark_GetNextSibling을 통해, 또는 뷰어의 클릭 히트 테스트 과정에서) 이 인덱서에 넘겨 해석된 제목 텍스트, 대상 PageNumber, TPdfAction 종류, 관련 URI / 파일 경로를 받으세요
반환 레코드는 스냅샷입니다. 북마크 딕셔너리를 한 번 읽고 destination을 1 기반 페이지 번호로 디코딩합니다. 핸들 자체도 레코드에 담기므로 트리를 다시 훑지 않고도 PDFium API에 그대로 넘길 수 있습니다
Bookmarks(전부 깊이 우선으로 나열)나 BookmarkChildren(직계 자식만 반환)보다 세밀한 제어가 필요한 커스텀 아웃라인 순회를 만들 때 이 인덱서가 정석적인 방법입니다. 원본 PDFium 핸들과 BookmarkFrom 해석을 섞어 쓰면 예컨대 지연 로딩 트리 뷰를 만들 수 있습니다
| Handle | FPDF_BOOKMARK. PDFium C API나 이전 TBookmark.Handle 필드에서 얻은 nil이 아닌 북마크 핸들입니다. nil을 넘기면 0으로 채워진 레코드를 반환합니다. 핸들은 기반 문서가 로드되어 있는 동안에만 유효합니다 |
TBookmark 레코드가 소유하지 않으므로 PDFium 해제 함수를 호출하지 마세요. 아웃라인 핸들은 문서가 닫힐 때 PDFium이 알아서 해제합니다Action 필드는 Bookmark와 LinkAnnotation과 같은 TPdfAction enum을 쓰므로, 아웃라인 항목이든 링크 주석이든 같은 디스패처 코드로 클릭을 처리할 수 있습니다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;