我正在构建一个使用 Rust 提取 PDF 文件中图像的工具。现在我可以提取除 PNG 以外的所有其他图像。
我使用了一个名为
pdf
的箱子来提取图像。
let mut images: Vec<_> = vec![];
for page in file.pages() {
let page = page.unwrap();
let resources = page.resources()?;
images.extend(
resources
.xobjects
.iter()
.map(|(_name, &r)| file.get(r).unwrap())
.filter(|o| matches!(**o, pdf::object::XObject::Image(_))),
)
}
现在根据过滤器我设置格式
for (i, o) in images.iter().enumerate() {
let img = match **o {
XObject::Image(ref im) => im,
_ => continue,
};
let (data, filter) = img.raw_image_data(&file)?;
use StreamFilter::*;
let ext = match filter {
Some(DCTDecode(_)) => "jpeg",
Some(JBIG2Decode) => "jbig2",
Some(JPXDecode) => "jp2k",
_ => {
log::debug!("main : unsupported image format");
continue;
}
};
当PNG图像在PDF文件中时会出现问题。
filter
始终是 None
值。所以我尝试使用 image
板条箱来解码 PNG 图像。
for (i, o) in images.iter().enumerate() {
let img = match **o {
XObject::Image(ref im) => im,
_ => continue,
};
let (data, filter) = img.raw_image_data(&file)?;
use StreamFilter::*;
let ext = match filter {
Some(DCTDecode(_)) => "jpeg",
Some(JBIG2Decode) => "jbig2",
Some(JPXDecode) => "jp2k",
_ => {
let img = image::io::Reader::new(Cursor::new(data.clone()))
.with_guessed_format()?
.decode()?;
"png"
}
};
但是在运行代码时我得到了
Error: Unsupported(UnsupportedError { format: Unknown, kind: Format(Unknown) })
我试图阅读PDF 1.7参考文档然后使用
flate2
库解压数据但我得到了
Error : Invalid Signature
我应该如何从这里开始?