@@ -85,31 +85,63 @@ impl Reader {
8585 self . document . trailer = trailer;
8686 self . document . reference_table = xref;
8787
88- for entry in self . document . reference_table . entries . values ( ) . filter ( |entry|entry. is_normal ( ) ) {
88+ let mut zero_length_streams = vec ! [ ] ;
89+ for entry in self . document . reference_table . entries . values ( ) . filter ( |entry| entry. is_normal ( ) ) {
8990 match * entry {
90- XrefEntry :: Normal { offset, ..} => {
91+ XrefEntry :: Normal { offset, .. } => {
9192 let read_result = self . read_object ( offset as usize ) ;
9293 match read_result {
9394 Ok ( ( object_id, mut object) ) => {
9495 match object {
9596 Object :: Stream ( ref mut stream) => if stream. dict . type_is ( b"ObjStm" ) {
9697 let mut obj_stream = ObjectStream :: new ( stream) ;
9798 self . document . objects . append ( & mut obj_stream. objects ) ;
99+ } else if stream. content . len ( ) == 0 {
100+ zero_length_streams. push ( object_id) ;
98101 } ,
99102 _ => { }
100103 }
101104 self . document . objects . insert ( object_id, object) ;
102- } ,
103- Err ( err) => { println ! ( "{:?}" , err) ; }
105+ }
106+ Err ( err) => {
107+ println ! ( "{:?}" , err) ;
108+ }
104109 }
105- } ,
106- _ => { } ,
110+ }
111+ _ => { }
107112 } ;
108113 }
109114
115+ for object_id in zero_length_streams {
116+ if let Some ( length) = self . get_stream_length ( object_id) {
117+ if let Some ( ref mut object) = self . document . get_object_mut ( object_id) {
118+ match object {
119+ Object :: Stream ( ref mut stream) => if let Some ( start) = stream. start_position {
120+ let end = start + length as usize ;
121+ stream. set_content ( self . buffer [ start..end] . to_vec ( ) ) ;
122+ } ,
123+ _ => { }
124+ }
125+ }
126+ }
127+ }
128+
110129 Ok ( ( ) )
111130 }
112131
132+ fn get_stream_length ( & self , object_id : ObjectId ) -> Option < i64 > {
133+ let object = self . document . get_object ( object_id) . unwrap ( ) ;
134+ match object {
135+ Object :: Stream ( ref stream) => stream. dict . get ( "Length" ) . and_then ( |value| {
136+ if let Some ( id) = value. as_reference ( ) {
137+ return self . document . get_object ( id) . and_then ( |value| value. as_i64 ( ) ) ;
138+ }
139+ return value. as_i64 ( ) ;
140+ } ) ,
141+ _ => None ,
142+ }
143+ }
144+
113145 /// Get object offset by object id.
114146 fn get_offset ( & self , id : ObjectId ) -> Option < u32 > {
115147 if let Some ( entry) = self . document . reference_table . get ( id. 0 ) {
0 commit comments