1
1
extern crate pdf;
2
2
3
+ use std:: collections:: HashMap ;
3
4
use std:: env:: args;
4
- use std:: time:: SystemTime ;
5
5
use std:: fs;
6
- use std:: collections :: HashMap ;
6
+ use std:: time :: SystemTime ;
7
7
8
+ use pdf:: enc:: StreamFilter ;
9
+ use pdf:: error:: PdfError ;
8
10
use pdf:: file:: { FileOptions , Log } ;
9
11
use pdf:: object:: * ;
10
12
use pdf:: primitive:: Primitive ;
11
- use pdf:: error:: PdfError ;
12
- use pdf:: enc:: StreamFilter ;
13
13
14
14
struct VerboseLog ;
15
15
impl Log for VerboseLog {
@@ -21,7 +21,7 @@ impl Log for VerboseLog {
21
21
}
22
22
}
23
23
24
- #[ cfg( feature= "cache" ) ]
24
+ #[ cfg( feature = "cache" ) ]
25
25
fn main ( ) -> Result < ( ) , PdfError > {
26
26
let path = args ( ) . nth ( 1 ) . expect ( "no file given" ) ;
27
27
println ! ( "read: {}" , path) ;
@@ -38,7 +38,7 @@ fn main() -> Result<(), PdfError> {
38
38
( Some ( title) , None ) => title,
39
39
( None , Some ( author) ) => format ! ( "[no title] – {}" , author) ,
40
40
( Some ( title) , Some ( author) ) => format ! ( "{} – {}" , title, author) ,
41
- _ => "PDF" . into ( )
41
+ _ => "PDF" . into ( ) ,
42
42
} ;
43
43
println ! ( "{}" , descr) ;
44
44
}
@@ -56,27 +56,35 @@ fn main() -> Result<(), PdfError> {
56
56
} ;
57
57
fonts. insert ( name, font. clone ( ) ) ;
58
58
}
59
- images. extend ( resources. xobjects . iter ( ) . map ( |( _name, & r) | resolver. get ( r) . unwrap ( ) )
60
- . filter ( |o| matches ! ( * * o, XObject :: Image ( _) ) )
59
+ images. extend (
60
+ resources
61
+ . xobjects
62
+ . iter ( )
63
+ . map ( |( _name, & r) | resolver. get ( r) . unwrap ( ) )
64
+ . filter ( |o| matches ! ( * * o, XObject :: Image ( _) ) ) ,
61
65
) ;
62
66
}
63
67
64
68
for ( i, o) in images. iter ( ) . enumerate ( ) {
65
69
let img = match * * o {
66
70
XObject :: Image ( ref im) => im,
67
- _ => continue
71
+ _ => continue ,
68
72
} ;
69
- let ( data, filter) = img. raw_image_data ( & resolver) ?;
73
+ let ( mut data, filter) = img. raw_image_data ( & resolver) ?;
70
74
let ext = match filter {
71
75
Some ( StreamFilter :: DCTDecode ( _) ) => "jpeg" ,
72
76
Some ( StreamFilter :: JBIG2Decode ( _) ) => "jbig2" ,
73
77
Some ( StreamFilter :: JPXDecode ) => "jp2k" ,
74
78
Some ( StreamFilter :: FlateDecode ( _) ) => "png" ,
79
+ Some ( StreamFilter :: CCITTFaxDecode ( _) ) => {
80
+ data = fax:: tiff:: wrap ( & data, img. width , img. height ) . into ( ) ;
81
+ "tiff"
82
+ }
75
83
_ => continue ,
76
84
} ;
77
85
78
86
let fname = format ! ( "extracted_image_{}.{}" , i, ext) ;
79
-
87
+
80
88
fs:: write ( fname. as_str ( ) , data) . unwrap ( ) ;
81
89
println ! ( "Wrote file {}" , fname) ;
82
90
}
@@ -105,8 +113,10 @@ fn main() -> Result<(), PdfError> {
105
113
}
106
114
107
115
if let Ok ( elapsed) = now. elapsed ( ) {
108
- println ! ( "Time: {}s" , elapsed. as_secs( ) as f64
109
- + elapsed. subsec_nanos( ) as f64 * 1e-9 ) ;
116
+ println ! (
117
+ "Time: {}s" ,
118
+ elapsed. as_secs( ) as f64 + elapsed. subsec_nanos( ) as f64 * 1e-9
119
+ ) ;
110
120
}
111
121
Ok ( ( ) )
112
122
}
0 commit comments