pub struct Bookmark {
pub dict: Dict,
pub depth: usize,
}Expand description
One outline item.
Fields§
§dict: DictThe item’s dictionary.
depth: usizeHow deep in the outline it sits; the top level is zero.
Implementations§
Source§impl Bookmark
impl Bookmark
Sourcepub fn title<R: Resolve>(&self, r: &R) -> String
pub fn title<R: Resolve>(&self, r: &R) -> String
The item’s title.
Two details: /Title is type-filtered to a string, so a
name-valued title reads as empty; and every code unit below 0x20 is
raised to a space, so control characters become blanks without
changing the length. The second matters because titles are compared
case-insensitively when searching.
use pdfrum_common::{Diagnostics, Limits};
use pdfrum_doc::nav::outline_bookmarks;
use pdfrum_object::{Dict, Name, NoResolve, Object, PdfString};
let item = Dict::from_pairs([
(Name::from("Title"), Object::Str(PdfString::literal(b"Introduction"))),
]);
let outlines = Dict::from_pairs([(Name::from("First"), Object::Dict(item))]);
let catalog = Dict::from_pairs([(Name::from("Outlines"), Object::Dict(outlines))]);
let (limits, mut diags) = (Limits::default(), Diagnostics::default());
let bookmarks = outline_bookmarks(&catalog, &NoResolve, &limits, &mut diags);
assert_eq!(bookmarks[0].title(&NoResolve), "Introduction");Sourcepub fn count<R: Resolve>(&self, r: &R) -> i64
pub fn count<R: Resolve>(&self, r: &R) -> i64
/Count: positive for an open item with that many visible
descendants, negative for a closed one, zero for a leaf.
The sign is preserved and the value is not masked.
use pdfrum_common::{Diagnostics, Limits};
use pdfrum_doc::nav::outline_bookmarks;
use pdfrum_object::{Dict, Name, NoResolve, Object, PdfString};
let item = Dict::from_pairs([
(Name::from("Title"), Object::Str(PdfString::literal(b"Introduction"))),
]);
let outlines = Dict::from_pairs([(Name::from("First"), Object::Dict(item))]);
let catalog = Dict::from_pairs([(Name::from("Outlines"), Object::Dict(outlines))]);
let (limits, mut diags) = (Limits::default(), Diagnostics::default());
let bookmarks = outline_bookmarks(&catalog, &NoResolve, &limits, &mut diags);
// A leaf: zero, with no `/Count` in the file.
assert_eq!(bookmarks[0].count(&NoResolve), 0);Sourcepub fn style<R: Resolve>(&self, r: &R) -> i64
pub fn style<R: Resolve>(&self, r: &R) -> i64
/F, the style flag word, unmasked — a file writing 15 reports
15, not the two defined bits.
use pdfrum_common::{Diagnostics, Limits};
use pdfrum_doc::nav::outline_bookmarks;
use pdfrum_object::{Dict, Name, NoResolve, Object, PdfString};
let item = Dict::from_pairs([
(Name::from("Title"), Object::Str(PdfString::literal(b"Introduction"))),
]);
let outlines = Dict::from_pairs([(Name::from("First"), Object::Dict(item))]);
let catalog = Dict::from_pairs([(Name::from("Outlines"), Object::Dict(outlines))]);
let (limits, mut diags) = (Limits::default(), Diagnostics::default());
let bookmarks = outline_bookmarks(&catalog, &NoResolve, &limits, &mut diags);
assert_eq!(bookmarks[0].style(&NoResolve), 0);Sourcepub fn color<R: Resolve>(&self, r: &R) -> Option<(f32, f32, f32)>
pub fn color<R: Resolve>(&self, r: &R) -> Option<(f32, f32, f32)>
/C, the item’s colour, as three components in [0, 1].
The array must hold exactly three entries and every one must be a
number inside the unit interval; anything else is no colour. Upstream
dereferences a non-number here without checking, which is a latent
crash — we answer None.
use pdfrum_common::{Diagnostics, Limits};
use pdfrum_doc::nav::outline_bookmarks;
use pdfrum_object::{Dict, Name, NoResolve, Object, PdfString};
let item = Dict::from_pairs([
(Name::from("Title"), Object::Str(PdfString::literal(b"Introduction"))),
]);
let outlines = Dict::from_pairs([(Name::from("First"), Object::Dict(item))]);
let catalog = Dict::from_pairs([(Name::from("Outlines"), Object::Dict(outlines))]);
let (limits, mut diags) = (Limits::default(), Diagnostics::default());
let bookmarks = outline_bookmarks(&catalog, &NoResolve, &limits, &mut diags);
// No `/C`: no colour. So is any array that is not exactly three
// numbers inside the unit interval.
assert_eq!(bookmarks[0].color(&NoResolve), None);Sourcepub fn action<R: Resolve>(&self, r: &R) -> Option<Action>
pub fn action<R: Resolve>(&self, r: &R) -> Option<Action>
The item’s action.
use pdfrum_common::{Diagnostics, Limits};
use pdfrum_doc::nav::outline_bookmarks;
use pdfrum_object::{Dict, Name, NoResolve, Object, PdfString};
let item = Dict::from_pairs([
(Name::from("Title"), Object::Str(PdfString::literal(b"Introduction"))),
]);
let outlines = Dict::from_pairs([(Name::from("First"), Object::Dict(item))]);
let catalog = Dict::from_pairs([(Name::from("Outlines"), Object::Dict(outlines))]);
let (limits, mut diags) = (Limits::default(), Diagnostics::default());
let bookmarks = outline_bookmarks(&catalog, &NoResolve, &limits, &mut diags);
assert!(bookmarks[0].action(&NoResolve).is_none());Sourcepub fn dest<R: Resolve>(
&self,
catalog: &Dict,
r: &R,
limits: &Limits,
diags: &mut Diagnostics,
) -> Dest
pub fn dest<R: Resolve>( &self, catalog: &Dict, r: &R, limits: &Limits, diags: &mut Diagnostics, ) -> Dest
Where the item goes: /Dest first, the action’s destination only when
that yields no array.
use pdfrum_common::{Diagnostics, Limits};
use pdfrum_doc::nav::outline_bookmarks;
use pdfrum_object::{Dict, Name, NoResolve, Object, PdfString};
let item = Dict::from_pairs([
(Name::from("Title"), Object::Str(PdfString::literal(b"Introduction"))),
]);
let outlines = Dict::from_pairs([(Name::from("First"), Object::Dict(item))]);
let catalog = Dict::from_pairs([(Name::from("Outlines"), Object::Dict(outlines))]);
let (limits, mut diags) = (Limits::default(), Diagnostics::default());
let bookmarks = outline_bookmarks(&catalog, &NoResolve, &limits, &mut diags);
let dest = bookmarks[0].dest(&catalog, &NoResolve, &limits, &mut diags);
assert!(dest.array.is_none());