如何解码 PDF 文件中的 PNG 图像?

问题描述 投票:0回答:0

我正在构建一个使用 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

我应该如何从这里开始?

pdf rust encoding png decoding
© www.soinside.com 2019 - 2024. All rights reserved.