pub fn parse(bytes: Arc<Vec<u8>>) -> Result<Arc<Document>, LoadError>Expand description
Parse a PDF’s bytes into a reusable Document. The Document owns the bytes,
so the caller can drop its own copy. Returns LoadError::Locked for a
password-protected file (retry with parse_with_password).
Examples found in repository?
examples/extract_text.rs (line 13)
7fn main() {
8 let mut args = std::env::args().skip(1);
9 let path = args.next().expect("usage: extract_text <file.pdf> [page]");
10 let page: usize = args.next().and_then(|s| s.parse().ok()).unwrap_or(0);
11
12 let bytes = Arc::new(std::fs::read(&path).expect("read pdf"));
13 let doc = gpui_pdf::parse(bytes).expect("parse pdf");
14
15 match gpui_pdf::extract_page_text(&doc, page) {
16 Some(pt) if !pt.is_empty() => {
17 println!("--- page {page} text ---");
18 println!("{}", pt.text());
19 }
20 Some(_) => eprintln!("page {page}: no extractable text (scanned image?)"),
21 None => eprintln!("no page {page}"),
22 }
23}More examples
examples/dump_outline.rs (line 9)
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}