pdf/parser/
parse_object.rs1use 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
11pub 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}