You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:47:55