1

我的程序处理 PDF 文件并从中读取一些流。那里也有 FlateEncoded 流。我使用 zlib 的“inflate()”方法来解压它们。

这通常适用于以下代码:

static string FlateDecode(string s){

    int factor = 50;
    z_stream stream;
    while(true){
        char * out = new char[s.length()*factor];           

        stream.zalloc = Z_NULL;
        stream.zfree = Z_NULL;
        stream.opaque = Z_NULL;
        stream.avail_in = s.length();
        stream.next_in = (Bytef*)s.c_str();
        stream.avail_out = s.length()*factor;
        stream.next_out = (Bytef*)out;
        inflateInit(&stream);
        inflate(&stream, Z_FINISH);
        inflateEnd(&stream);


        if(stream.total_out >= factor*s.length()){
            delete[] out;
            factor *= 2;
            continue;

        }
        string result;
        for(unsigned long i = 0; i < stream.total_out; i++){
            result += out[i];
        }

        delete[] out;
        return result;
    }
}

但是对于某些流,inflate 的结果为空。这并不经常,但它会发生。有人知道为什么吗?

流必须没问题,因为所有 PDF 阅读器都能正确读取 PDF 文件。

谢谢你的帮助!

更新

我已经上传了 PDF 和流,所以你可以自己检查。

PDF -> 流从字节 43296 开始

溪流

更新 2

我比较了不能解压的流和可以解压的流。我注意到一件有趣的事情:工作流都以 2 个字节的 H% 开头。有问题的流以 ö> 开头。现在有人知道这意味着什么吗?

谢谢你的帮助!

4

2 回答 2

2

您不应该在每次迭代时重新初始化流。在循环之前初始化它并在循环inflate()内调用,直到它返回Z_OKor Z_STREAM_END

于 2011-02-01T15:42:40.967 回答
0

zlib 似乎根本不支持 PDF 文件中的所有压缩流。

于 2011-05-19T12:34:40.460 回答