Skip to content

Commit 65c123d

Browse files
Expand the pdf/examples/read to extract processable tiff files (#212)
* rustfmt autoformatting * add tiff metadata to make a valid tiff file
1 parent 947466c commit 65c123d

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

pdf/examples/read.rs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
extern crate pdf;
22

3+
use std::collections::HashMap;
34
use std::env::args;
4-
use std::time::SystemTime;
55
use std::fs;
6-
use std::collections::HashMap;
6+
use std::time::SystemTime;
77

8+
use pdf::enc::StreamFilter;
9+
use pdf::error::PdfError;
810
use pdf::file::{FileOptions, Log};
911
use pdf::object::*;
1012
use pdf::primitive::Primitive;
11-
use pdf::error::PdfError;
12-
use pdf::enc::StreamFilter;
1313

1414
struct VerboseLog;
1515
impl Log for VerboseLog {
@@ -21,7 +21,7 @@ impl Log for VerboseLog {
2121
}
2222
}
2323

24-
#[cfg(feature="cache")]
24+
#[cfg(feature = "cache")]
2525
fn main() -> Result<(), PdfError> {
2626
let path = args().nth(1).expect("no file given");
2727
println!("read: {}", path);
@@ -38,7 +38,7 @@ fn main() -> Result<(), PdfError> {
3838
(Some(title), None) => title,
3939
(None, Some(author)) => format!("[no title] – {}", author),
4040
(Some(title), Some(author)) => format!("{} – {}", title, author),
41-
_ => "PDF".into()
41+
_ => "PDF".into(),
4242
};
4343
println!("{}", descr);
4444
}
@@ -56,27 +56,35 @@ fn main() -> Result<(), PdfError> {
5656
};
5757
fonts.insert(name, font.clone());
5858
}
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(_))),
6165
);
6266
}
6367

6468
for (i, o) in images.iter().enumerate() {
6569
let img = match **o {
6670
XObject::Image(ref im) => im,
67-
_ => continue
71+
_ => continue,
6872
};
69-
let (data, filter) = img.raw_image_data(&resolver)?;
73+
let (mut data, filter) = img.raw_image_data(&resolver)?;
7074
let ext = match filter {
7175
Some(StreamFilter::DCTDecode(_)) => "jpeg",
7276
Some(StreamFilter::JBIG2Decode(_)) => "jbig2",
7377
Some(StreamFilter::JPXDecode) => "jp2k",
7478
Some(StreamFilter::FlateDecode(_)) => "png",
79+
Some(StreamFilter::CCITTFaxDecode(_)) => {
80+
data = fax::tiff::wrap(&data, img.width, img.height).into();
81+
"tiff"
82+
}
7583
_ => continue,
7684
};
7785

7886
let fname = format!("extracted_image_{}.{}", i, ext);
79-
87+
8088
fs::write(fname.as_str(), data).unwrap();
8189
println!("Wrote file {}", fname);
8290
}
@@ -105,8 +113,10 @@ fn main() -> Result<(), PdfError> {
105113
}
106114

107115
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+
);
110120
}
111121
Ok(())
112122
}

0 commit comments

Comments
 (0)