如何在Rust中解码PDF文件中的PNG图像?
提取PDF中PNG图像的问题
我正在用Rust开发一个提取PDF文件中图像的工具,目前可以提取除PNG以外的所有图像。
当前实现代码
提取图像资源
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; } };
问题与尝试过程
PDF中的PNG图像对应的filter始终为None,于是我尝试用image crate解码这类图像,修改后的代码如下:
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
请问我该如何推进解决这个问题?
内容的提问来源于stack exchange,提问作者Omkar
相关产品推荐
相关产品推荐

