Skip to main content

parse

Function parse 

Source
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
Hide additional 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}