dump_outline/
dump_outline.rs1use std::sync::Arc;
3
4fn main() {
5 let path = std::env::args()
6 .nth(1)
7 .expect("usage: dump_outline <file.pdf>");
8 let bytes = std::fs::read(&path).expect("read pdf");
9 let doc = gpui_pdf::parse(Arc::new(bytes)).expect("parse pdf");
10 let pages = gpui_pdf::page_dims(&doc).len();
11 let items = gpui_pdf::outline(&doc);
12 println!("== {pages} pages, {} outline items ==", items.len());
13 let (mut resolved, mut unresolved) = (0, 0);
14 for it in &items {
15 let page = match it.page {
16 Some(p) => {
17 resolved += 1;
18 format!("p{}", p + 1)
19 }
20 None => {
21 unresolved += 1;
22 "?".to_string()
23 }
24 };
25 println!("{}{} [{page}]", " ".repeat(it.level), it.title);
26 }
27 println!("== {resolved} resolved to a page, {unresolved} unresolved ==");
28
29 let links = gpui_pdf::page_links(&doc);
30 let total: usize = links.iter().map(Vec::len).sum();
31 let (mut internal, mut external) = (0, 0);
32 for l in links.iter().flatten() {
33 match l.target {
34 gpui_pdf::LinkTarget::Page(_) => internal += 1,
35 gpui_pdf::LinkTarget::Uri(_) => external += 1,
36 }
37 }
38 let pages_with_links = links.iter().filter(|p| !p.is_empty()).count();
39 println!(
40 "== {total} link annotations ({internal} internal, {external} external) on \
41 {pages_with_links} pages =="
42 );
43}