pdf/parser/
parse_object.rs

1// Considering whether to impl Object and IndirectObject here.
2//
3
4use crate::parser::{lexer::*, MAX_DEPTH};
5use crate::error::*;
6use crate::primitive::{Primitive, PdfStream};
7use crate::parser::{parse_with_lexer_ctx, parse_stream_with_lexer, Context, ParseFlags};
8use crate::object::*;
9use crate::crypt::Decoder;
10
11/// Parses an Object starting at the current position of `lexer`. Almost as
12/// `Reader::parse_object`, but this function does not take `Reader`, at the expense that it
13/// cannot dereference 
14
15pub fn parse_indirect_object(lexer: &mut Lexer, r: &impl Resolve, decoder: Option<&Decoder>, flags: ParseFlags) -> Result<(PlainRef, Primitive)> {
16    let id = PlainRef {
17        id: t!(lexer.next()).to::<ObjNr>()?,
18        gen: t!(lexer.next()).to::<GenNr>()?,
19    };
20    lexer.next_expect("obj")?;
21
22    let ctx = Context {
23        decoder,
24        id,
25    };
26    let obj = t!(parse_with_lexer_ctx(lexer, r, Some(&ctx), flags, MAX_DEPTH));
27
28    if r.options().allow_missing_endobj {
29        let pos = lexer.get_pos();
30        if let Err(e) = lexer.next_expect("endobj") {
31            warn!("error parsing obj {} {}: {:?}", id.id, id.gen, e);
32            lexer.set_pos(pos);
33        }
34    } else {
35        t!(lexer.next_expect("endobj"));
36    }
37
38    Ok((id, obj))
39}
40pub fn parse_indirect_stream(lexer: &mut Lexer, r: &impl Resolve, decoder: Option<&Decoder>) -> Result<(PlainRef, PdfStream)> {
41    let id = PlainRef {
42        id: t!(lexer.next()).to::<ObjNr>()?,
43        gen: t!(lexer.next()).to::<GenNr>()?,
44    };
45    lexer.next_expect("obj")?;
46
47    let ctx = Context {
48        decoder,
49        id,
50    };
51    let stm = t!(parse_stream_with_lexer(lexer, r, &ctx));
52
53    t!(lexer.next_expect("endobj"));
54
55    Ok((id, stm))
56}